EzJDBCの第3の機能!


これまで、EzJDBCの下記の2つの機能について説明してきました。


1.SQL自動生成機能(EzJDBC-Auto)

 // メインテーブル情報インスタンスを生成します。
 CUSTOMER CUS = new CUSTOMER();
 // CUSTOMERテーブルとORDERテーブルを結合しデータを取得します。
 List list = EzJDBC.from(CUS).join(CUS.ORD)
                   .where(CUS.name.like("takahashi%"))
                   .and(CUS.ORD.orderDate.betWeen(20090101, 20091231))
                   .orderBy(CUS.id.asc(), CUS.ORD.orderDate.desc())
                   .find(Customer.class);

2.SQLファイル機能(EzJDBC-File)

SQLファイル名「CustomerOrder.sql

SELECT
   CUS.ID, CUS.NAME, ...
FROM
   CUSTOMER CUS LEFT JOIN ORDER ORD
   ON (CUS.ID = ORD.CUSTOMER_ID) AND (CUS.ORDER_NO = ORD.NO)
WHERE
   CUS.NAME LIKE /*name*/'takahashi%'
   AND ORD.ORDER_DATE BETWEEN /*orderDates*/(20090101, 20091231)
ORDER BY
   CUS.ID ASC,
   ORD.ORDER_DATE DESC

 // CustomerOrder.sqlファイルのパラメータBeanを生成し抽出条件の比較値をセット
 CustomerOrder cusOrd = new CustomerOrder();
 cusOrd.name = "takahashi%";
 cusOrd.orderDates(20090101, 20091231);
 // CustomerOrder.sqlファイルのSQLにパラメータをセットしデータを取得します。
 List list = EzJDBC.from(cusOrd).find(Customer.class);

そして第3の機能として、テーブル情報クラスやSQLファイルを必要としない、「EzJDBC-Free」機能を照会します。

まったくもって大した機能ではありません。ただ単純にSQLを文字列として利用可能とし、照会結果をEntityにマッピングするだけの機能です。

今回は説明の便宜上、SQLをString変数に格納していますが、SQLは文字列であれば良いのでプロパティファイルなりTextファイルなり、XMLファイルなり、StringBuilderで動的に生成するなり好きにしちゃって下さい...(^^)

 // 今回の説明に利用するSQL
 String sql = "SELECT CUS.ID, CUS.NAME, .. FROM CUSTOMER CUS "
         + "LEFT JOIN ORDER ORD ON (CUS.ID = ORD.CUSTOMER_ID)"
         + "AND (CUS.ORDER_NO = ORD.NO)"
         + "/* CONDITION_BEGIN */ "
         + "WHERE CUS.NAME LIKE '高橋%' "
         + "AND ORD.ORDER_DATE BETWEEN (99990101, 99991231) "
         + "/* CONDITION_FINAL */ "
         + "/* ORDERBY_BEGIN */"
         + "ORDER BY CUS.ID DESC, ORD.ORDER_DATE ASC"
         + "/* ORDERBY_FINAL */";

ネイティブSQLはプログラムで利用する前にSQLツール(CSE等)で事前に確認する場合がほとんどだと思います。

プログラムで利用するSQLは、「抽出条件」なり「並び順」なりは動的に変更するとしても、SQLツールで確認する際にはサンプルとして抽出条件や並び順を特定しなくてはいけません。
そうなるとツールで事前に確認したSQLと実際にプログラムで利用するSQLが異なってしないます。


具体的には、ツールで確認したSQLからプログラムで動的に変更する箇所を削除してプログラムで利用するということになります。


そいつは美味しくない!って事で「EzJDBC-Free」では、「コメント・バインディング機能」を実装しています。
コメント・バインディング機能機能とは、今書きながら適当に思いついた言葉なので、今回以外は利用しませんが、ある特定のSQLコメントで囲まれたSQLはプログラムで利用する際には、動的に置き換えられる機能です。


また、これらのコメントはSQLツールでは単なるコメントとして取り扱われるので、SQLにサンプルとして記述してある抽出条件や並び順は正しく評価されます。。。


SQLコメントは以下の2種類です。

1.抽出条件部を置き換えるコメント
 /* CONDITION_BEGIN */…/* CONDITION_FINAL */
2.並び順部を置き換えるコメント
 /* ORDERBY_BEGIN */…/* ORDERBY_FINAL */

EzJDBC-Freeの利用方法は以下の通りです。
String sql = ...の箇所は上記のSQLが記述されると思ってください。

 String sql = ...
 List list = EzJDBC.from(sql)
                   .where("CUS.NAME", like("takahashi%"))
                   .and("ORD.ORDER_DATE", between(20090101, 20091231))
                   .orderBy("CUS.ID ASC, ORDER.ORDER_DATE DESC")
                   .find(Customer.class);

 like(...)やbetween(...)は、EzFreeConditionクラスのメソッドでstatic importされています。

または

 String sql = ...
 List list = EzJDBC.from(sql)
        .where("CUS.NAME like ? AND ORD.ORDER_DATE BETWEEN ? AND ?")
        .set("takahashi%", 20090101, 20091231);
        .orderBy("CUS.ID ASC, ORDER.ORDER_DATE DESC")
        .find(Customer.class);

下のほうが完全なフリーフォーマットSQLですね。。。

EzJDBCは「Auto」,「File」,「Free」の3種類の方式でテーブルへのアクセスを可能にします。


Freeは素のまま利用するというよりも独自にラップして利用してもらう事を目指した機能です。。。


すばらしぃぃぃー(o^∀^)o