1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-03-20

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、質問等も募集中です。
是非使ってみて下さい。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?