Kotlin向け高機能RowMapper、KRowMapperを作った


SpringFramework 5.3/SpringBoot 2.4にて、コンストラクタ呼び出しでマッピングを行うDataClassRowMapperが追加されました。
機能面ではKRowMapperの方が勝っていると思いますが、外部ライブラリを導入する程の苦しみを感じていない場合、こちらの利用をお勧めします。


前書き

以前弊社の技術ブログで紹介したKotlin向けBeanPropertyRowMapper的なものですが、この度KRowMapperとしてOSS化しました。

この記事では、KRowMapperの基本的な使い方についてまとめます。
0.2時点での内容です。

ライブラリのソースコードはGitHubに公開してあります。

導入方法

JitPackにて公開しており、MavenGradleといったビルドツールから利用できます。
詳しい導入方法は以下のリンクからご確認ください。

開発背景

冒頭の技術ブログで述べた通り、Kotlindata 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、質問等も募集中です。
是非使ってみて下さい。