Clione-SQL is Line and Indent Oriented, Nested-structured, 2WaySQL library
http://code.google.com/p/clione-sql/
偶然見つけたJavaのDBアクセスライブラリ(Apache CommonsのDbUtilsかMirage風といったおもむき。
2Way SQLの仕様がとてもユニーク。
ClioneSQL works on 4 simple rules.
Rule 1. ClioneSQLは1行単位で処理をする。これを以下ではLineUnitと呼ぶ。
Rule 2. LineUnitはインデントにより下記のように入れ子構造の親子関係が定義される。WHERE -- parent ROW1 = /* $key1 */'value1' -- child1 AND ROW2 = /* $key2 */'value2' -- child2 AND ( -- child3 ROW3_1 = /* $key3_1 */'value3_1' -- child of child3 OR ROW3_2 =/* $key3_2 */'value3_2' -- child of child3 )Rule 3. LineUnitが持つ子が全て除去されたら、そのLineUnitも除去される。上の例では、key3_1, key3_2の両方がnullなら、child3も除去される。key1, key2もnullなら、parentごと除去される。
Rule 4. 親LineUnitの後に来る最初の子LineUnitの先頭にセパレータ(AND/OR/,)があるとき、それは除去される。上の例では、key3_1がnullで除去された場合には下のkey3_2の先頭の「,」が除去される。key1がnullで除去された場合には、その下のkey2の先頭の「AND」が除去される。このように、SQLファイルのインデントを調整すれば、サブクエリーなどを持つ複雑なSQL文であっても、動的にな操作が簡単かつ安全に実現できる。
http://code.google.com/p/clione-sql/#How_it_works?
Javadocコメントが無いので使ってみるは、ちょっとハードル高いけど、staticインポートをうまく活用してたり、なかなか意欲的なライブラリだった。なにより、2Way SQLが良くできてる。まさに「その発想はなかった」って感じ。:-)
イマドキだったらJPAなのかもしれないけど、DBアクセスはSQLが使えて、シンプルなのがいいよね?と思うと、どうしても、この手の独自実装系に辿り着いてしまいますねと。DBアクセスまわりがいつまで経っても標準仕様と独自仕様の狭間で揺れ動いてて正直ウンザリな気持ちもしますが、こうゆう刺激的なライブラリを見つけるとやっぱり楽しくなりますね。
ps.
もともとは「2Way SQLのパーサ *だけ* って無いのかな?」と思って探したら偶然見つけた。なので、本当に欲しかったのは「2Way SQLのパーサ」。案外無いので、clione-sqlとかmirage、s2jdbcのソース読んで勉強するしかないかなと思ってる。