学習用ORマッパー「EzJDBC」の作成 その2
昨日の続きです。
SQL自動生成
EzJDBCは、流れるようなインターフェースを利用して、テーブルより対象となるデータを取得できます。
先ほどの例を利用して、EzJDBCの機能を説明します。
// メインテーブルの顧客テーブル情報インスタンスを生成します。
CUSTOMER _CUSTOMER = new CUSTOMER();
// CUSTOMERテーブルとORDERテーブルを結合し抽出条件に一致した結果を取得します。
List result = new EzJDBC().from(_CUSTOMER)
.join(_CUSTOMER._ORDER)
.where(_CUSTOMER.ID.in(1, 2, 3))
.orderBy()
.asc(_CUSTOMER.ID)
.find(Customer.class);
EzJDBCを利用する場合の手順は、下記の通りです。
1. メインテーブルの「テーブル情報クラス」をインスタンス化します。
2. EzJDBCをインスタンス化します。
3. 流れるようなインターフェースを利用して、結合、抽出、並び順の設定及び結果の取得を行ないます。
それでは、各手順の詳細について説明しましょう。
1. メインテーブルの「テーブル情報クラス」をインスタンス化します。
検索を行なう場合は、単独テーブルの場合でも、複数テーブルを結合した場合でも、インスタンス
化するテーブル情報クラスは、メインとなるテーブルのクラスのみとなります。
上記例では、「CUSTOMERテーブル」と「ORDERテーブル」を結合した参照ですが、CUSTOMERクラス
のみインスタンス化している事が、わかると思います。
テーブル情報クラスとは?
EzJDBCのSQL自働生成機能は、テーブル情報クラスにより、タイプセーフ開発を実現しています。
テーブル情報クラスは、名前の通り「テーブル」の項目情報や結合情報を保持したクラスです。テーブル情報クラスは、scaffoldを利用して、テーブル定義書より自動生成します。クラス名は、テーブル名と同名になります。
以下の説明は、EzJDBCを利用するためには不要ですので、読み飛ばしても問題ありません。読み飛ばす方は「2. EzJDBCをインスタンス化します。」までジャンプ!
タイプセーフを可能にする「テーブル定義クラス」とは?
テーブル情報クラスについては、あれこれ説明するよりも、実際に見てみたほうが分かり易いでしょう。
CUSTOMERテーブルの「テーブル情報クラス」を例に説明します。
CUSTOMERテーブル情報クラス
public class CUSTOMER {
/** テーブル別名 */
public String asName = "CUSTOMER";/** CUSTOMER番号(ID)フィールドの情報 */
public IntType ID = new IntType(this.asName, "ID", 10, 0);… その他項目情報
/** ORDERテーブルとの結合条件を格納するフィールドです */
public ORDER _ORDER = new ORDER(this, "ORDER")
.condition(this.ID, new ORDER().CUSTOMER_ID);… その他結合情報
}public IntType ID = new IntType(this.asName, "ID", 10, 0);
上記のプロパティーは、CUSTOMERテーブルの「ID」項目の情報を保持する属性です。
コンストラクターに受け渡している情報は、下記の4情報です。
・テーブル名(CUSTOMER)
・項目名(ID)
・整数桁数
・少数桁数public ORDER _ORDER = new ORDER(this, "ORDER")
.condition(this.ID, new ORDER().CUSTOMER_ID);上記のプロパティーは、CUSTOMERテーブルと「ORDERテーブル」の結合情報を
保持する属性です。
コンストラクターに受け渡している情報は、下記の2情報です。
・親テーブルの情報(CUSTOMERインスタンス)
・結合先テーブルの別名(ORDERテーブルのテーブル別名)
conditionメソッドは、CUSTOMERテーブルとORDERテーブルの結合条件の設定
を行ないます。
メソッドに受け渡している情報は、下記の2情報です。
・親(CUSTOMER)テーブルの結合項目名
・子(ORDER)テーブルの結合項目名
2. EzJDBCをインスタンス化します。
特に記述するようなことは無いのですが、一言だけ、EzJDBCを「new」しなさい。以上です。
データベースの接続先は、どこで設定するの?
ソースフォルダー配下の下記のXMLに、どちらかの情報を記述して下さい。
XMLのPATH : setting/aop/EzConfig.xml
(1) データソース接続の場合
<?xml version="1.0" encoding="Shift_JIS" ?>
<classes>
<class name="RDB_RESOURCE"
classname="are.trygun.framework.transaction.Resource">
<property name="datasourceKey">"JNDIキー"</property>
</class>
</classes>赤文字の箇所に、接続する先RDBの情報を記述して下さい。
(2) JDBC接続の場合
<?xml version="1.0" encoding="Shift_JIS" ?>
<classes>
<class name="RDB_RESOURCE"
classname="are.trygun.framework.transaction.Resource">
<property name="driverManager">"DRIVAER"</property>
<property name="url">"URL"</property>
<property name="userid">"USERID"</property>
<property name="password">"PASSWORD"</property>
<property name="poolingCounter">5</property>
</class>
</classes>赤字の箇所に、接続する先RDBの情報を記述して下さい。
最後の「5 」は、コネクション・プーリングする数を設定します。「5」となっている箇所に数値で指定してください。
3. 流れるようなインターフェースを利用して、結合、抽出、並び順の設定及び結果の取得を行ないます。
下記のEzJDBC利用例を元に「流れるようなインターフェース」のメソッドいついて説明します。
// メインテーブルの顧客テーブル情報インスタンスを生成します。
CUSTOMER _CUSTOMER = new CUSTOMER();
// CUSTOMERテーブルとORDERテーブルを結合し抽出条件に一致した結果
// を取得します。
List result = new EzJDBC().from(_CUSTOMER)
.join(_CUSTOMER._ORDER)
.where(_CUSTOMER.ID.in(1, 2, 3))
.orderBy()
.asc(_CUSTOMER.ID)
.find(Customer.class);下記に、各設定&実行メソッドの説明を記述します。
1. fromメソッド
from(_CUSTOMER)は、CUSTOMER(メイン)テーブルを指定した事を表しています。
2. joinメソッド
join(_CUSTOMER._ORDER)メソッドは、CUSTOMERテーブルとORDERテーブルのJOINを指定して事を表しています。
JOINの結合条件(ON)は、CUSTOMERクラス(テーブル情報クラス)の「_ORDER」フィールドで指定されています(詳細は、P5の「テーブル情報クラス」を参照)。
注意:テーブル情報クラスは自動生成されるので意識する必要はありません。
3. whereメソッド
where(_CUSTOMER.ID.in(1, 2, 3)メソッドは、抽出条件を指定するメソッドです。「_CUSTOMER.ID」は、抽出条件の項目名を表し、「.in(1, 2, 3)」メソッドのinは「IN句」を表しています。Inメソッドのシグニチャ(1, 2, 3)は、比較値となります。
4. orderByメソッド
orderBy().asc(_CUSTOMER.ID)メソッドは、ソート(昇順)をあらわしており、シグニチャとして受け渡されている「_CUSTOMER.ID」は、ソートする項目名を表します。
5. findメソッド
find(Customer.class)は、SQLを発行し結果を取得するメソッドです。findメソッドのシグニチャの「Customer.class」は、参照結果を格納する"エンティティ"になります。エンティティについて
参照結果を格納するエンティティは、POJOで作成可能です。
EzJDBCでは、従来通りsetterを介して、データをセットする他に、publicフィールドに対応しています。
publicフィールド対応とは、エンティティのプロパティー修飾子を「public」する事により、setterメソッドが存在しなくても、エンティティにデータをバインドします。
findメソッドのシグニチャに、エンティティクラスを指定しなかった場合は、参照結果を「EzDto.class(List&Map)」に格納して返します。
SQL自働生成 FAQ
つづく