Skip to content

Latest commit

 

History

History
227 lines (185 loc) · 6.77 KB

File metadata and controls

227 lines (185 loc) · 6.77 KB

Module bluetape4k-exposed-jackson3

English | 한국어

A module for serializing and deserializing Exposed JSON/JSONB columns using Jackson 3.

Overview

bluetape4k-exposed-jackson3 provides serialization and deserialization of JetBrains Exposed JSON/JSONB column types using Jackson 3.x. It takes advantage of Jackson 3's new features and improved performance.

Key Features

  • Jackson 3 column types: JSON/JSONB column mapping
  • Serializer support: Jackson 3 serializer configuration
  • JSON functions/conditions: Helpers for building JSON query expressions
  • ResultRow extensions: Utilities for reading JSON column values

Dependency

dependencies {
    implementation("io.github.bluetape4k:bluetape4k-exposed-jackson3:${version}")
    implementation("io.github.bluetape4k:bluetape4k-jackson3:${version}")
}

Basic Usage

1. Defining JSON Columns

import io.bluetape4k.exposed.core.jackson3.jackson
import io.bluetape4k.exposed.core.jackson3.jacksonb
import org.jetbrains.exposed.v1.core.dao.id.IdTable

// Data class
data class UserSettings(
    val theme: String = "light",
    val notifications: Boolean = true,
    val language: String = "ko"
)

// Table definition
object Users: IdTable<Long>("users") {
    val name = varchar("name", 100)

    // JSON column (string-based)
    val settings = jackson<UserSettings>("settings")

    // JSONB column (binary format)
    val preferences = jacksonb<Map<String, Any>>("preferences")
}

2. Using JSON Columns

// Insert
Users.insert {
    it[name] = "John"
    it[settings] = UserSettings(
        theme = "dark",
        notifications = false,
        language = "en"
    )
}

// Query
val user = Users.selectAll().where { Users.id eq 1L }.single()
val settings: UserSettings = user[Users.settings]

3. JSON Condition Expressions

import io.bluetape4k.exposed.core.jackson3.*

// Search by JSON path
val query = Users.selectAll()
    .where { Users.settings.jsonPath<String>("$.theme") eq "dark" }

// Search by JSON containment
val query2 = Users.selectAll()
    .where { Users.settings.jsonContains("language", "ko") }

Jackson 2 vs Jackson 3

Feature Jackson 2 Jackson 3
Package com.fasterxml.jackson tools.jackson
Java version Java 8+ Java 17+
Performance Good Improved
Recommendation Stable / established New projects

Key Files / Classes

File Description
JacksonColumnType.kt JSON column type (string-based)
JacksonBColumnType.kt JSONB column type (binary format)
JacksonSerializer.kt Jackson 3 serializer configuration
JsonFunctions.kt JSON function extensions
JsonConditions.kt JSON condition expression extensions
ResultRowExtensions.kt ResultRow JSON read extensions

Testing

./gradlew :bluetape4k-exposed-jackson3:test

Architecture Diagram

Column Type Structure (Summary)

classDiagram
    direction LR
    class JacksonColumnType~T~ {
        <<ColumnType>>
        -objectMapper: ObjectMapper
        +valueFromDB(value): T
        +valueToDB(value): Any
    }
    class JacksonBColumnType~T~ {
        <<ColumnTypeJSONB>>
        -objectMapper: ObjectMapper
        +valueFromDB(value): T
        +valueToDB(value): PGobject
    }
    class TableExtensions {
        <<extensionFunctions>>
        +Table.jackson~T~(name): Column~T~
        +Table.jacksonb~T~(name): Column~T~
    }
    JacksonColumnType <|-- JacksonBColumnType
    TableExtensions --> JacksonColumnType : creates
    TableExtensions --> JacksonBColumnType : creates

    style JacksonColumnType fill:#E0F2F1,stroke:#80CBC4,color:#00695C
    style JacksonBColumnType fill:#E0F2F1,stroke:#80CBC4,color:#00695C
    style TableExtensions fill:#FFF3E0,stroke:#FFCC80,color:#E65100
Loading

JSON Column Type Class Structure

classDiagram
    class ColumnType {
        <<Exposed base abstract>>
        +sqlType(): String
        +valueFromDB(value): T
        +notNullValueToDB(value): Any
    }
    class JacksonColumnType~T~ {
        -objectMapper: ObjectMapper
        +sqlType(): String
        +valueFromDB(value): T
        +notNullValueToDB(value): String
    }
    class JacksonBColumnType~T~ {
        -objectMapper: ObjectMapper
        +sqlType(): String
        +valueFromDB(value): T
        +notNullValueToDB(value): ByteArray
    }
    class JacksonSerializer {
        +configure(objectMapper): ObjectMapper
    }
    class JsonFunctions {
        +Column.jsonPath(path): Expression
        +Column.jsonContains(field, value): Op
    }
    class ResultRowExtensions {
        +ResultRow.getJackson(col): T
        +ResultRow.getJacksonOrNull(col): T?
    }

    ColumnType <|-- JacksonColumnType
    ColumnType <|-- JacksonBColumnType
    JacksonSerializer --> JacksonColumnType : provides ObjectMapper
    JacksonSerializer --> JacksonBColumnType : provides ObjectMapper
    JacksonColumnType --> JsonFunctions : integrates
    ResultRowExtensions --> JacksonColumnType : uses
    ResultRowExtensions --> JacksonBColumnType : uses

    style ColumnType fill:#ECEFF1,stroke:#B0BEC5,color:#37474F
    style JacksonColumnType fill:#E0F2F1,stroke:#80CBC4,color:#00695C
    style JacksonBColumnType fill:#E0F2F1,stroke:#80CBC4,color:#00695C
    style JacksonSerializer fill:#FFF3E0,stroke:#FFCC80,color:#E65100
    style JsonFunctions fill:#FFFDE7,stroke:#FFF176,color:#F57F17
    style ResultRowExtensions fill:#FFFDE7,stroke:#FFF176,color:#F57F17
Loading

Jackson 2 vs Jackson 3 Package Differences

flowchart LR
    subgraph Jackson2["bluetape4k-exposed-jackson (Jackson 2.x)"]
        A2["com.fasterxml.jackson.*"]
        B2["jackson&lt;T&gt; / jacksonb&lt;T&gt;"]
    end
    subgraph Jackson3["bluetape4k-exposed-jackson3 (Jackson 3.x)"]
        A3["tools.jackson.*"]
        B3["jackson&lt;T&gt; / jacksonb&lt;T&gt;"]
    end
    C[Kotlin Object] -->|serialize| Jackson2
    C -->|serialize| Jackson3
    Jackson2 -->|deserialize| C
    Jackson3 -->|deserialize| C

    classDef objectStyle fill:#ECEFF1,stroke:#B0BEC5,color:#37474F
    classDef jackson2Style fill:#E3F2FD,stroke:#90CAF9,color:#1565C0
    classDef jackson3Style fill:#E0F2F1,stroke:#80CBC4,color:#00695C

    class C objectStyle
    class Jackson2 jackson2Style
    class Jackson3 jackson3Style
Loading

References