SpringFramework 5.3
/SpringBoot 2.4
にて、コンストラクタ呼び出しでマッピングを行うDataClassRowMapper
が追加されました。
機能面ではKRowMapper
の方が勝っていると思いますが、外部ライブラリを導入する程の苦しみを感じていない場合、こちらの利用をお勧めします。
前書き
以前弊社の技術ブログで紹介したKotlin
向けBeanPropertyRowMapper
的なものですが、この度KRowMapper
としてOSS
化しました。
この記事では、KRowMapper
の基本的な使い方についてまとめます。
0.2
時点での内容です。
ライブラリのソースコードはGitHub
に公開してあります。
導入方法
JitPack
にて公開しており、Maven
やGradle
といったビルドツールから利用できます。
詳しい導入方法は以下のリンクからご確認ください。
開発背景
冒頭の技術ブログで述べた通り、Kotlin
のdata class
等で使えるBeanPropertyRowMapper
的なものの需要が有ったためです。
なにができるか
RowMapper
のインターフェースから、コンストラクタやファクトリーメソッドを呼び出すことができます。
// before
val dst = jdbcTemplate.query(query) { rs, _ ->
Dst(
rs.getString("foo"),
rs.getString("bar"),
rs.getInt("baz"),
...
)
}
// after
val dst = jdbcTemplate.query(query, KRowMapper(::Dst))
KRowMapperの引数
KRowMapper
の引数は、基本的にはコンストラクタやファクトリメソッド、インスタンス関数を含むメソッドリファレンス(≒ KFunction<*>
)です。
クラスを引数とすることで、プライマリコンストラクタ、もしくはKConstructor
アノテーションを振ったコンストラクタ/ファクトリーメソッドを呼び出し対象とすることも可能です。
命名ケースの変換
KRowMapper
は、デフォルトではキャメルケースでカラムとのマッチングを行います。
DBがスネークケース等の命名規則を採用している場合、以下のように変換関数を渡すことで対応できます。
KRowMapper(::Dst) { colName: String ->
// 何らかの変換関数、こっこではGuavaを用いている
CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, colName)
}
Javaへの対応に関して
基本的にJava
のクラス・関数には対応しません。
マッピングにはKotlin
のメタデータを利用していることと、Java
では引数の名前が取得できない場合があることが理由です。
終わりに
今回は自作のKotlin
向けBeanPropertyRowMapper
的なライブラリ、KRowMapper
に関して書きました。
紹介していない機能や開発中の機能等有りますが、長くなるので個別の記事としてまとめようと思います。
PR、質問等も募集中です。
是非使ってみて下さい。