Version v0.27 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