Open9

急いで調査するKomapper

com4dccom4dc

Komapper とは

Kotlin Native な ORM

https://www.komapper.org/ja/docs/

他に対抗としてありそうなのは、Jetbrains の Exposed

https://github.com/JetBrains/Exposed

Komapper について

https://tech.isid.co.jp/entry/2021/12/14/database_access_in_kotlin_using_komapper

ORMのタイプ

Query Builder 系に見える。Doma2 のような 2 way SQL といった形ではなさそう?

com4dccom4dc

コメントいただきありがとうございます。
Doma2 の 2 way SQL 機能を多用していたので、このあたりサポートいただけているのはとてもありがたいです 🙏

com4dccom4dc

JDBC, R2DBC がサポートされているため、 Spring の Servlet, Reactive 双方で利用できそう

https://www.komapper.org/ja/docs/overview/

Meta モデル

テーブルをマッピングする定義を記述。アノテーションにより動的にコードが生成され、 Meta クラスの拡張プロパティとしてアクセスできるようになる。これを利用して Query を組み立てる。

つまり、テーブル定義を行った後一度コード生成しないと、 Meta の拡張プロパティとして登録されないのでビルドが一旦必要そう。

com4dccom4dc

Database

Database インスタンスからアクセスが基本。Spring で利用する場合は Bean に登録して DI する形か。

https://www.komapper.org/ja/docs/reference/database/

Example なので設定値を直値で入力してインスタンス化。通常だとハードコーディングはまずいのでなんか回避。
Spring の場合だと application.yaml からの設定読み込みか。この辺り spring の starter が提供されているのでサポートされていそう。

javax.sql.DataSource

こちらの方が馴染み深い。この場合、対応する DB 製品によるドライバの差異があるので、別途 Dialect 参照の上、同時に指定が必要(当然依存にも必要

https://www.komapper.org/ja/docs/reference/dialect/

Transaction

db.withTransaction {
}

これは楽で良い

Query

val a = Meta.address
val query: Query<List<Address>> = QueryDsl.from(a)
val result: List<Address> = db.runQuery(query)

直観的でわかりやすい。
返却値の型指定で動的に変換か。

com4dccom4dc

Database 設定

https://www.komapper.org/ja/docs/reference/database-config/

Default 設定を利用し、適宜必要な個所を上書きがよさそう。

clockProvider

Komapper 側で設定するメタデータ系の日時を制御するための Clock のプロバイダ設定っぽい。
テストの際に固定値で上書きして、テスト実行時の日時に左右されないテストが書けそう(試してはいない。単なる予想

com4dccom4dc

Database 設定

https://www.komapper.org/ja/docs/reference/database-config/

Default 設定を利用し、適宜必要な個所を上書きがよさそう。

clockProvider

Komapper 側で設定するメタデータ系の日時を制御するための Clock のプロバイダ設定っぽい。
テストの際に固定値で上書きして、テスト実行時の日時に左右されないテストが書けそう(試してはいない。予想

nakamura_tonakamura_to

はい、その通りです。
@KomapperCreatedAt@KomapperUpdatedAtを付与したプロパティにタイムスタンプを設定する際に利用されます。

com4dccom4dc

こちらもコメントありがとうございます 🙏
CreatedAt, UpdatedAt をテスト時に Injection できるのテストの際にとても助かります