SQLの組み立て用APIを実装してみました

SNAPSHOTおいておきます。

使い方はこんな感じです。@Delegateと組み合わせて使うのがお奨めです。

SELECT
SelectBuilder builder = SelectBuilder.newInstance(config);
builder.sql("select");
builder.sql("id").sql(",");
builder.sql("name").sql(",");
builder.sql("salary");
builder.sql("from Emp");
builder.sql("where");
builder.sql("name like ").param(String.class, "S%");
builder.sql("and");
builder.sql("age > ").param(int.class, 20);

Emp emp = builder.getSingleResult(Emp.class);

// 複数件の取得は getResultList で
// List<Emp> list = builder.getResultList(Emp.class);
UPDATE
UpdateBuilder builder = UpdateBuilder.newInstance(config);
builder.sql("update Emp");
builder.sql("set");
builder.sql("name = ").param(String.class, "SMIHT").sql(",");
builder.sql("salary = ").param(BigDecimal.class, new BigDecimal("1000"));
builder.sql("where");
builder.sql("id = ").param(int.class, 10);

builder.execute();
INSERT
InsertBuilder builder = InsertBuilder.newInstance(config);
builder.sql("insert into Emp");
builder.sql("(name, salary)");
builder.sql("values (");
builder.param(String.class, "SMITH").sql(", ");
builder.param(int.class, 100).sql(")");

builder.execute();
DELETE
DeleteBuilder builder = DeleteBuilder.newInstance(config);
builder.sql("delete from Emp");
builder.sql("where");
builder.sql("name = ").param(String.class, "aaa");
builder.sql("and");
builder.sql("salary = ").param(int.class, 10);

builder.execute();

実際の利用例はこちらをどうぞ

自前のAPIで処理することで、SQLのログや名前変換(カラム名とプロパティ名など)やドメインクラスの扱いを他の処理と統一できるのが利点です。(Spring JDBCDbUtilsを使うとそのあたり自前で処理しなければいけない)

追記

このAPISQLファイルではどうしても実現できない(もしくは実現しづらい)という場合の、最終手段で使ってもらえたらなぁと思います。多くのケースでは、SQLファイルを使ったほうが何かと便利です(テストがしやすいとか、RDBMSごとに異なるSQLを発行できるとか、エンティティリスナーの呼び出しに対応しているとか)。