Version v0.24 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.
Database
概要
KomapperでデータベースにアクセスするためにはJdbcDatabase
もしくはR2dbcDatabase
のインスタンスが必要です。
ここでは、これらを総称してDatabaseインスタンスと呼びます。
Databaseインスタンスはトランザクションの制御やクエリの実行を担当します。
Databaseインスタンスの生成
Databaseインスタンスの生成方法はJDBCを使う場合とR2DBCを使う場合で異なります。
JDBCを使う場合
URLから生成する場合は次のように記述します。
val db: JdbcDatabase = JdbcDatabase.create("jdbc:h2:mem:example;DB_CLOSE_DELAY=-1")
URLに加えてユーザー名やパスワードを指定する場合は次のように記述します。
val db: JdbcDatabase = JdbcDatabase.create(
url = "jdbc:h2:mem:example;DB_CLOSE_DELAY=-1",
user = "sa",
password = ""
)
javax.sql.DataSource
を指定することもできます。
ただし、その場合はdialect
の指定も必要です。
val dataSource: DataSource = ...
val db: JdbcDatabase = JdbcDatabase.create(
dataSource = dataSource,
dialect = H2JdbcDialect()
)
以下のドキュメントも参照ください。
R2DBCを使う場合
URLから生成する場合は次のように記述します。
val db: R2dbcDatabase = R2dbcDatabase.create("r2dbc:h2:mem:///example;DB_CLOSE_DELAY=-1")
io.r2dbc.spi.ConnectionFactoryOptions
から生成する場合は次のように記述します。
options
にはConnectionFactoryOptions.DRIVER
をキーとする値を含めなければいけません。
val options = ConnectionFactoryOptions.builder()
.option(ConnectionFactoryOptions.DRIVER, "h2")
.option(ConnectionFactoryOptions.PROTOCOL, "mem")
.option(ConnectionFactoryOptions.DATABASE, "example")
.option(Option.valueOf("DB_CLOSE_DELAY"), "-1")
.build()
val db: R2dbcDatabase = R2dbcDatabase.create(options)
io.r2dbc.spi.ConnectionFactory
を指定することもできます。
ただし、その場合はdialect
の指定も必要です。
val connectionFactory: ConnectionFactory = ...
val db: R2dbcDatabase = R2dbcDatabase.create(
connectionFactory = connectionFactory,
dialect = H2R2dbcDialect()
)
以下のドキュメントも参照ください。
Databaseインスタンスの利用
トランザクションの制御
DatabaseインスタンスのwithTransaction
拡張関数でトランザクションを制御します。
withTransaction
拡張関数にはトランザクション内で処理したいロジックをラムダ式として渡します。
db.withTransaction {
...
}
詳細は Transaction を参照ください。
クエリの実行
DatabaseインスタンスのrunQuery
関数を呼び出すことでクエリを実行できます。
val a = Meta.address
val query: Query<List<Address>> = QueryDsl.from(a)
val result: List<Address> = db.runQuery { query }
DatabaseインスタンスがR2dbcDatabase
の場合でクエリの型がorg.komapper.core.dsl.query.FlowQuery
のとき、flow
関数を実行できます。
val a = Meta.address
val query: FlowQuery<Address> = QueryDsl.from(a)
val flow: Flow<Address> = db.flow { query }
データベースへのアクセスはflow
関数から返されるFlow
インスタンスを利用したときに初めて行われます。
クエリの生成については Query を参照ください。
低レベルAPIの実行
Komapperの提供する高レベルAPI(Query )が要件に合わない場合、 低レベルAPI(JDBCやR2DBCのAPI)を利用できます。
JDBCのAPIを直接利用するには、JdbcDatabase
インスタンスからいくつかのプロパティを呼び出してjava.sql.Connection
を取得します。
db.config.session.connection.use { con ->
val sql = "select employee_name from employee where employee_id = ?"
con.prepareStatement(sql).use { ps ->
ps.setInt(1,10)
ps.executeQuery().use { rs ->
if (rs.next()) {
println(rs.getString(1))
}
}
}
}
同様に、R2DBCのAPIを直接利用するにはR2dbcDatabase
インスタンスから
いくつかのプロパティを呼び出してio.r2dbc.spi.Connection
のPublisher
を取得します。
val con: Publisher<out Connection> = db.config.session.connection