少し前にKotlinのreified type parameterというものに関する記事を書きました。
Kotlinで関数に渡された型パラメータによって処理を分岐させる方法
これを活かせばちょっと面白いJDBCラッパーが作れそうだなぁと思いつき作ってみました。
GitHub: https://github.com/dotneet/devneko-kotlin-jdbc
#主な機能
- 名前付きプレースホルダー
JDBCでは"?"をプレースホルダーに使いますが、わかりにくいので名前付きプレースホルダーを使います。 - StatementやResultSetに対するシンプルなパラメータ設定/取得
Statement#setInt()などのように型ごとに定義されたset/getメソッドを呼ぶ必要がなくなります。 - レコードのデータクラスへのマッピング
SELECT項目を使って自動的にインスタンスを生成してくれます。
#コード例
##準備
// DBテーブルに対応するデータクラス
// post(id:INTEGER, userId:INTEGER, body:VARCHAR2(255), created:DATETIME)
data class Post(
id:Int,
userId:Int,
body:String,
created:Date
)
// ヘルパークラスを生成する。connectionはjava.sql.Connection
val helper = SqlHelper(connection)
##SELECT
// すべて取得してクラスにマップ
val results:List<Post> = helper.query("SELECT * FROM post WHERE id = :id") {
set("id", 1)
}.readAll()
// ひとつ取得してクラスにマップ
val post:Post = helper.query("SELECT * FROM post WHERE id = :id") {
set("id", 1)
}.readOne()
// query()はResultSetを拡張したオブジェクトを返す。
val rs = helper.query("SELECT * FROM post WHERE id = :id") {
set("id", 1)
}
while ( rs.next() ) {
val id:Long = rs.get("id")
println(id)
}
##INSERT
helper.insert("post") {
set("id", 1)
set("user_id", 1)
set("body", "body")
set("created", java.util.Date())
}
##UPDATE
helper.update("post") {
set("body", "new body")
where("id = :id") {
set("id", 1)
}
}
##DELETE
helper.delete("post", "id = :id") {
set("id", 1)
}