commons-dbutils-1.2

ApacheDbUtilsは1.1までしかリリースされてないけど、リポジトリ見たら1.2までタグが切られてた。

http://svn.apache.org/viewvc/commons/proper/dbutils/tags/

そろそろジェネリクス対応とかしちゃってんの??とか思ったけど、ぜんぜんだめ。
あ、でも 以前書いたあり得ないくらい非効率な処理 は修正されてた。

commons-beanutilsでは、1.8でジェネリクス対応できてたから、commons全体でも徐々に対応していくんだろかと思ったけど、プロジェクトごとに違うんだねー。

SX-DbUtilsで対応するには、QueryRunnerとかResultSetHandlerを完全に置き換えなきゃいかんなー。どーしよ。

QueryRunnerの限界

commons-dbutilsはORマッパーではありません。でも貧弱な機能ながら、BeanHandlerとかBeanListHandlerといったORマッパーみたいな機能が用意されてたりします。
でも逆は提供されていません。update(Object)とかそんなメソッド。ここがORマッパーではない、一つのラインではないかと思います。
dbutilsの拡張版を作るとき、DBに対してinsert/update/deleteといったメソッドを提供してしまうと、それはもはや簡易的なORマッパーだと思うのです。DBユーティリティとは言えなくなってきます。
たぶん、QueryRunnerで出来ること以上をやろうとしてしまったら、それはもはやcommons-dbutilsじゃあありません。すでにcommons-dbutilsを使っているプロジェクトには導入出来ないと思うし、習得のハードルが上がってしまいます。

じゃあ、INSERT/UPDATEは無理なのかというとそんなわけではなく、要はINSERT/UPDATEのSQLをさくっと作れればそれでいいんじゃないかと思うんです。SX-DbUtilsではBeanのインスタンスからSQLとパラメータ配列のセットを作り出す機能を提供するつもりです。そいつをQueryRunnerに渡せばINSERT/UPDATEも出来ます。

で、ここでPreparedStatementへのパラメータバインドが問題になってきます。
ORマッパーならばupdate(Object)などで渡されるオブジェクトから、テーブルのカラムとオブジェクトのプロパティのマッピング情報を取り出して最適な形式でバインドが可能です。しかしマッピングするオブジェクトもカラム情報もわからないQueryRunnerでは不可能です。

QueryRunnerの中で、PreparedStatementを取得する部分は1カ所に集約されているため、独自に拡張することでこの問題をある程度解決することもできますが、プロジェクトごとに独自QueryRunnerを作っているところではアウトです。コンポジションという手もありますが、やればやるほど複雑になっていき、こうしているうちにだんだんQueryRunnerじゃなくてもよくなってくる気がします。

結局、QueryRunnerには手を加えない方が望ましいと思うんです。
そうなると、ほとんどをデフォルトのQueryRunnerのfillStatement(PreparedStatementのsetObject)を呼び出すことになります。ここから先はJDBCドライバの優しさに依存してしまうわけです。でもたぶんあまり問題は出ないと思ってますし、問題あるときはいろいろ逃げ道があるとおもいます。

commons-dbutilsを便利にするのは割と簡単なんですが、便利にしすぎないってのが難しいんですよね。

Supplement と eXtension

SX-DbUtilsなんてもんを作ってて気をつけてるのが、「どこまでが補完で、どこからが拡張なのか」ということ。
ResultSetHandlerやRowProcessorの不備に関しては こりゃ間違いなく補完なんだけど、じゃあINSERT/UPDATE関係は?といわれると、うーん、拡張なんだけどそのくらいデフォルトで用意してないのがおかしいんじゃね?とか思うわけです。
まぁ今のところは基本機能に属すると思われる物は補完と考えてます。

なんか紹介されちゃったよ

たけぞうさんとこで紹介されてしまった。

〜SX DBUtilsには期待です。
〜実用的なライブラリになりそうです。

http://www3.vis.ne.jp/~asaki/p_diary/diary.cgi?Date=20090315/

なにこのプレッシャー。

DbUtilsについて

前にも書いたんだけど、DbUtilsを使う(ことが決まってる)プロジェクトに参加してます。
とはいえ、まだ開発が始まっていません。で、開発が始まる前に以前書いたDbUtilsの独自拡張を書き直しました。んでついでにOSSで公開しちゃった。

SX-DbUtils 〜commons-dbutils補完計画〜

だって無いんだもん。同じようなことやってるライブラリが。単純なことなのに。

ORマッパー、特にHibernateで痛い目みてDbUtilsに行く現場って多いと思うんですよね。まぁ今のとこもそうなんですがね。でも気持ちはよくわかる。

QueryRunnerを独自拡張してたり、SQL実行部分を隠蔽してたりしてるプロジェクトって多いですよね。その手のフレームワークを強制する現場じゃ、新たにORマッパーとか導入できなかったりするわけです。
既存のフレームワークが効率UPを阻害しているけどDbUtilsで通すしかない。
もしくは、DbUtilsを生で使ってて、そんなに効率が上がっていない。

そんなとき、効率UPの選択肢の一つになるよう、こいつを作っています。

DbUtilsの後付けできるプラグイン。それがこいつのポジション。
ちなみにASFライセンスです。