Komapper
Kotlin ORM for JDBC and R2DBC
Install / Use
/learn @komapper/KomapperREADME
Komapper: Kotlin ORM for JDBC and R2DBC
Komapper is an ORM library for server-side Kotlin.
For more documentation, go to our site:
- https://www.komapper.org/docs/
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 1.9.24 or later
- JRE 11 or later
- Gradle 6.8.3 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.2.21"
id("com.google.devtools.ksp") version "2.3.0"
}
val komapperVersion = "6.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:
- https://www.komapper.org/docs/quickstart/
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 | Yes | 11 | 7.6.4 |
Compatibility testing is performed in the komapper/compatibility-test repository.
Financial Contributors
Support Komapper's development on Open Collective.
Organizations
Individuals
Powered by
Related Skills
oracle
349.0kBest practices for using the oracle CLI (prompt + file bundling, engines, sessions, and file attachment patterns).
prose
349.0kOpenProse VM skill pack. Activate on any `prose` command, .prose files, or OpenProse mentions; orchestrates multi-agent workflows.
Command Development
109.4kThis skill should be used when the user asks to "create a slash command", "add a command", "write a custom command", "define command arguments", "use command frontmatter", "organize commands", "create command with file references", "interactive command", "use AskUserQuestion in command", or needs guidance on slash command structure, YAML frontmatter fields, dynamic arguments, bash execution in commands, user interaction patterns, or command development best practices for Claude Code.
Plugin Structure
109.4kThis skill should be used when the user asks to "create a plugin", "scaffold a plugin", "understand plugin structure", "organize plugin components", "set up plugin.json", "use ${CLAUDE_PLUGIN_ROOT}", "add commands/agents/skills/hooks", "configure auto-discovery", or needs guidance on plugin directory layout, manifest configuration, component organization, file naming conventions, or Claude Code plugin architecture best practices.
