Version v1.4 of the documentation is no longer actively maintained. The site that you are currently viewing is an archived snapshot. For up-to-date documentation, see the latest version.
Data Types
Overview
This section describes data type mapping between Kotlin and databases.
Dialect data types
A dialect determines the default data type mapping between Kotlin and database.
User-defined data types
To map a user-defined Kotlin data type to a database data type, you must create and register a class that conforms to the Service Provider Interface specification.
For example, suppose you want to map the following Kotlin data type example.Age
to an INTEGER type in a database.
package example
data class Age(val value: Int)
In the case of JDBC
Create a class that implements org.komapper.jdbc.spi.JdbcUserDefinedDataType
to perform the mapping:
package example.jdbc
import example.Age
import org.komapper.jdbc.spi.JdbcUserDefinedDataType
import java.sql.JDBCType
import java.sql.PreparedStatement
import java.sql.ResultSet
import kotlin.reflect.KClass
class AgeType : JdbcUserDefinedDataType<Age> {
override val name: String = "integer"
override val klass: KClass<Age> = Age::class
override val jdbcType: JDBCType = JDBCType.INTEGER
override fun getValue(rs: ResultSet, index: Int): Age {
return Age(rs.getInt(index))
}
override fun getValue(rs: ResultSet, columnLabel: String): Age {
return Age(rs.getInt(columnLabel))
}
override fun setValue(ps: PreparedStatement, index: Int, value: Age) {
ps.setInt(index, value.value)
}
override fun toString(value: Age): String {
return value.value.toString()
}
}
Register the above class in a file with the following name:
META-INF/services/org.komapper.jdbc.spi.JdbcUserDefinedDataType
This file contains the fully qualified name of the class as follows:
example.jdbc.AgeType
You can register multiple classes together by separating lines.
In the case of R2DBC
Create a class that implements org.komapper.r2dbc.spi.R2dbcUserDefinedDataType
to perform the mapping:
package example.r2dbc
import example.Age
import io.r2dbc.spi.Row
import io.r2dbc.spi.Statement
import org.komapper.r2dbc.spi.R2dbcUserDefinedDataType
import kotlin.reflect.KClass
class AgeType : R2dbcUserDefinedDataType<Age> {
override val name: String = "integer"
override val klass: KClass<Age> = Age::class
override val javaObjectType: Class<*> = Int::class.javaObjectType
override fun getValue(row: Row, index: Int): Age? {
return row.get(index, Int::class.javaObjectType)?.let { Age(it) }
}
override fun getValue(row: Row, columnLabel: String): Age? {
return row.get(columnLabel, Int::class.javaObjectType)?.let { Age(it) }
}
override fun setValue(statement: Statement, index: Int, value: Age) {
statement.bind(index, value.value)
}
override fun setValue(statement: Statement, name: String, value: Age) {
statement.bind(name, value.value)
}
override fun toString(value: Age): String {
return value.value.toString()
}
}
Register the above class in a file with the following name:
META-INF/services/org.komapper.r2dbc.spi.R2dbcUserDefinedDataType
This file contains the fully qualified name of the class as follows:
example.r2dbc.AgeType
You can register multiple classes together by separating lines.
Data type conversion
To convert a data type to another type, you must create and register a class that conforms to the Service Provider Interface specification.
For example, suppose you want to treat Int
as the following example.PhoneNumber
in your application.
package example
data class PhoneNumber(val value: Int)
Create a class that implements org.komapper.core.spi.DataTypeConverter
to perform the conversion:
package example
import org.komapper.core.spi.DataTypeConverter
import kotlin.reflect.KClass
class PhoneNumberTypeConverter : DataTypeConverter<PhoneNumber, Int> {
override val exteriorClass: KClass<PhoneNumber> = PhoneNumber::class
override val interiorClass: KClass<Int> = Int::class
override fun unwrap(exterior: PhoneNumber): Int {
return exterior.value
}
override fun wrap(interior: Int): PhoneNumber {
return PhoneNumber(interior)
}
}
Register the above class in a file with the following name:
META-INF/services/org.komapper.core.spi.DataTypeConverter
This file contains the fully qualified name of the class as follows:
example.PhoneNumberTypeConverter
You can register multiple classes together by separating lines.
Value classes
When you use a value class, the inner type of the value class is used for mapping.
Support for kotlinx-datetime
Komapper supports following data types of kotlinx-datetime:
- kotlinx.datetime.Instant
- kotlinx.datetime.LocalDate
- kotlinx.datetime.LocalDateTime
To use these types, declare kotlinx-datetime
in the Gradle dependencies declaration as follows:
dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-datetime:0.3.2")
}
Also, declare komapper-datetime-jdbc
or komapper-datetime-r2dbc
:
val komapperVersion: String by project
dependencies {
runtimeOnly("org.komapper:komapper-datetime-jdbc:$komapperVersion")
}
Note
If you use one of the Starters , you do not need to declarekomapper-datetime-jdbc
and komapper-datetime-r2dbc
.