急いで調査するKomapper
Komapper とは
Kotlin Native な ORM
他に対抗としてありそうなのは、Jetbrains の Exposed
Komapper について
ORMのタイプ
Query Builder 系に見える。Doma2 のような 2 way SQL といった形ではなさそう?
ファイルから読み込む機能はないのですが、Doma2のような2 way SQLも使えるようになっています。
コメントいただきありがとうございます。
Doma2 の 2 way SQL 機能を多用していたので、このあたりサポートいただけているのはとてもありがたいです 🙏
JDBC, R2DBC がサポートされているため、 Spring の Servlet, Reactive 双方で利用できそう
Meta モデル
テーブルをマッピングする定義を記述。アノテーションにより動的にコードが生成され、 Meta
クラスの拡張プロパティとしてアクセスできるようになる。これを利用して Query を組み立てる。
つまり、テーブル定義を行った後一度コード生成しないと、 Meta
の拡張プロパティとして登録されないのでビルドが一旦必要そう。
Database
Database インスタンスからアクセスが基本。Spring で利用する場合は Bean に登録して DI する形か。
Example なので設定値を直値で入力してインスタンス化。通常だとハードコーディングはまずいのでなんか回避。
Spring の場合だと application.yaml からの設定読み込みか。この辺り spring の starter が提供されているのでサポートされていそう。
javax.sql.DataSource
こちらの方が馴染み深い。この場合、対応する DB 製品によるドライバの差異があるので、別途 Dialect 参照の上、同時に指定が必要(当然依存にも必要
Transaction
db.withTransaction {
}
これは楽で良い
Query
val a = Meta.address
val query: Query<List<Address>> = QueryDsl.from(a)
val result: List<Address> = db.runQuery(query)
直観的でわかりやすい。
返却値の型指定で動的に変換か。
Database 設定
Default 設定を利用し、適宜必要な個所を上書きがよさそう。
clockProvider
Komapper 側で設定するメタデータ系の日時を制御するための Clock
のプロバイダ設定っぽい。
テストの際に固定値で上書きして、テスト実行時の日時に左右されないテストが書けそう(試してはいない。単なる予想
Database 設定
Default 設定を利用し、適宜必要な個所を上書きがよさそう。
clockProvider
Komapper 側で設定するメタデータ系の日時を制御するための Clock
のプロバイダ設定っぽい。
テストの際に固定値で上書きして、テスト実行時の日時に左右されないテストが書けそう(試してはいない。予想
はい、その通りです。
@KomapperCreatedAt
や@KomapperUpdatedAt
を付与したプロパティにタイムスタンプを設定する際に利用されます。
こちらもコメントありがとうございます 🙏
CreatedAt
, UpdatedAt
をテスト時に Injection できるのテストの際にとても助かります