GitHub

Build Twitter Slack Maven Central Ask DeepWiki

Komapper is an ORM library for server-side Kotlin.

For more documentation, go to our site:

Features

Highlighted

  • Support for both JDBC and R2DBC
  • Code generation at compile-time using Kotlin Symbol Processing API
  • Immutable and composable queries
  • Support for Kotlin value classes
  • Easy Spring Boot integration

Experimental

  • Quarkus integration
  • Transaction management using context receivers

Prerequisite

  • Kotlin 2.3.21 or later
  • JRE 17 or later
  • Gradle 7.6.4 or later

Supported Databases

Komapper is tested with the following databases:

Database version JDBC support R2DBC support
H2 Database 2.3.232 v v
MariaDB 10.6.3 v v
MySQL v5.x 5.7.44 v v
MySQL v8.x 8.0.25 v v
Oracle Database XE 18.4.0 v v
PostgreSQL 12.9 v v
SQL Server 2019 v (unstable)

Supported connectivity types:

  • JDBC 4.3
  • R2DBC 1.0.0

Installation

Add the following code to the Gradle build script (gradle.build.kts).

plugins {
    kotlin("jvm") version "2.4.0"
    id("com.google.devtools.ksp") version "2.3.9"
}
val komapperVersion = "7.0.0"
dependencies {
    platform("org.komapper:komapper-platform:$komapperVersion").let {
        implementation(it)
        ksp(it)
    }
    implementation("org.komapper:komapper-starter-jdbc")
    implementation("org.komapper:komapper-dialect-h2-jdbc")
    ksp("org.komapper:komapper-processor")
}

See also Quickstart for more details:

Sample code

To get complete code, go to our example repository.

Entity class definition

@KomapperEntity
data class Address(
    @KomapperId
    @KomapperAutoIncrement
    @KomapperColumn(name = "ADDRESS_ID")
    val id: Int = 0,
    val street: String,
    @KomapperVersion
    val version: Int = 0,
    @KomapperCreatedAt
    val createdAt: LocalDateTime? = null,
    @KomapperUpdatedAt
    val updatedAt: LocalDateTime? = null,
)

Connecting with JDBC

fun main() {
    // create a Database instance
    val db = JdbcDatabase("jdbc:h2:mem:example;DB_CLOSE_DELAY=-1")
    // get a metamodel
    val a = Meta.address
    // execute simple operations in a transaction
    db.withTransaction {
        // create a schema
        db.runQuery {
            QueryDsl.create(a)
        }
        // INSERT
        val newAddress = db.runQuery {
            QueryDsl.insert(a).single(Address(street = "street A"))
        }
        // SELECT
        val address = db.runQuery {
            QueryDsl.from(a).where { a.id eq newAddress.id }.first()
        }
    }
}

Connecting with R2DBC

suspend fun main() {
    // create a Database instance
    val db = R2dbcDatabase("r2dbc:h2:mem:///example;DB_CLOSE_DELAY=-1")
    // get a metamodel
    val a = Meta.address
    // execute simple operations in a transaction
    db.withTransaction {
        // create a schema
        db.runQuery {
            QueryDsl.create(a)
        }
        // INSERT
        val newAddress = db.runQuery {
            QueryDsl.insert(a).single(Address(street = "street A"))
        }
        // SELECT
        val address = db.runQuery {
            QueryDsl.from(a).where { a.id eq newAddress.id }.first()
        }
    }
}

Design Policy

See DESIGN_DOC for the design policy of this project.

Compatibility Matrix

Kotlin and KSP version Komapper version KSP2 support? JRE min version Gradle min version
1.9.24-1.0.20 1.18.1 - 2.x No 11 6.8.3
2.0.21-1.0.28 2.x - 5.x Yes 11 7.6.4
2.1.21-2.0.2 5.x Yes 11 7.6.4
2.2.20-2.0.3 5.x Yes 11 7.6.4
2.3.0 5.x - 6.1.0 Yes 11 8.2
2.3.21 7.0.0 or later Yes 17 8.2
2.4.0 7.0.0 or later Yes 17 8.2

For Kotlin 2.3.0 and later, KSP is versioned independently of Kotlin (standalone KSP). These rows were verified with KSP 2.3.9.

Compatibility testing is performed in the komapper/compatibility-test repository.

Financial Contributors

Support Komapper's development on Open Collective.

Organizations

Organizations

Individuals

Individuals

Powered by

JetBrains logo.

Read the original on github.com ↗