学習用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

つづく