Version v0.18 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でデータベースにアクセスするためにはDatabaseインスタンスが必要です。 Databaseインスタンスはトランザクションの制御やクエリの実行を担当します。

Databaseインスタンスの生成

Databaseインスタンスの生成方法はJDBCを使う場合とR2DBCを使う場合で異なります。

JDBCを使う場合

URLから生成する場合は次のように記述します。

val db = JdbcDatabase.create("jdbc:h2:mem:example;DB_CLOSE_DELAY=-1")

URLに加えてユーザー名やパスワードを指定する場合は次のように記述します。

val db = JdbcDatabase.create(
  url = "jdbc:h2:mem:example;DB_CLOSE_DELAY=-1", 
  user = "sa", 
  password = ""
)

javax.sql.DataSourceを指定することもできます。 ただし、その場合はdialectの指定も必要です。

val dataSource: DataSource = ...
val db = JdbcDatabase.create(
  dataSource = dataSource, 
  dialect = H2JdbcDialect()
)

以下のドキュメントも参照ください。

R2DBCを使う場合

URLから生成する場合は次のように記述します。

val db = 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.create(options)

io.r2dbc.spi.ConnectionFactoryを指定することもできます。 ただし、その場合はdialectの指定も必要です。

val connectionFactory: ConnectionFactory = ...
val db = R2dbcDatabase.create(
  connectionFactory = connectionFactory, 
  dialect = H2R2dbcDialect()
)

以下のドキュメントも参照ください。

Databaseインスタンスの利用

トランザクションの制御

DatabaseインスタンスのwithTransaction拡張関数でトランザクションを制御します。 withTransaction拡張関数にはトランザクション内で処理したいロジックをラムダ式として渡します。

db.withTransaction {
    ...
}

詳細は Transaction を参照ください。

クエリの実行

DatabaseインスタンスのrunQuery関数を呼び出すことでクエリを実行できます。

val query = ...
val result = db.runQuery { query }

R2DBCを使っている場合でクエリの型がorg.komapper.core.dsl.query.FlowQueryのとき、flow関数を実行できます。

val query: FlowQuery = ...
val flow = db.flow { query }

クエリの生成については Query を参照ください。