単純な照会を実行してオブジェクトの Iterator を生成する

以下の例は、pureQuery を使用して特定の販売地域のすべての顧客を検索する方法を示しています。

データベース表と対応する Bean の定義

この例では、以下のような SALES.CUSTOMER という簡単な表の定義が使用されます。

CREATE TABLE SALES.CUSTOMER (
 CUSTID BIGINT NOT NULL,
 NAME VARCHAR(24),
 ADDRESSL1 VARCHAR(50),
 CITY VARCHAR(24),
 REGION BIGINT,
 PRIMARY KEY(CUSTID))

この表に対応する単純な Bean は以下のようになります。

public Customer {
    public Integer custId;
    public String name;
    public String addressL1;
    public String city;
    public Integer region;
 }

アノテーション付きメソッド・プログラミング・スタイル

アノテーション付きメソッドを使用してデータベース・オブジェクトを操作する場合、それらのメソッドを定義するインターフェースを定義し、pureQuery ジェネレーターを使用してそのインターフェースのインプリメンテーションを生成してから、インプリメンテーション・クラスにあるそれらのメソッドを呼び出すアプリケーションを作成する必要があります。

特定の販売地域に住んでいる顧客用に Customer オブジェクトをイテレーターにキャプチャーする照会の場合、以下のようなインターフェースを定義できます。

 import com.company.Customer; 
 public interface CustomerQuery
 {
   @Select(sql=
    "SELECT * FROM Customer WHERE region=?1")
   Iterator<Customer> getCustomersInRegion(int r);
 }

インターフェースは、顧客が住んでいる地域を識別する単一の int パラメーターに基づき、com.company.Customer オブジェクトの Iterator の戻りとして getCustomersInRegion() メソッドを定義します。

@Select アノテーションは、CUSTOMER 表の地域列と関数の最初の入力パラメーター (?1 とマークされている) が等しいことに基づいて、関数の戻り Iterator にデータをキャプチャーする SQL 照会を指定します。

インターフェースを定義した後、pureQuery ジェネレーターを実行してそのインターフェースのインプリメンテーションを生成することができます。 インプリメンテーションの名前は CustomerQueryImpl です。インプリメンテーションのパッケージは、CustomerQuery インターフェースが含まれるパッケージです。

CustomerQuery インターフェースのインプリメンテーションを生成した後で、それをアプリケーション内で以下のように使用できます。

 Connection con = DriverManager.getConnection(...);    1 
 CustomerQuery cqcQuery = 
     DataFactory.getData( CustomerQuery.class, con );  2 
 Customer c;
 int r = 123;
 Iterator<Customer> customers =                        3 
                      cqcQuery.getCustomersInRegion(r);
 while (customers.hasNext()){                          4 
    c = customers.next();
    System.out.println(c.custId+" "+c.name);
 }
 ((ResultIterator) customers).close();                 5 

このコードは、以下のステップを実行します。

  1. データベースへの接続を作成します。
  2. CustomerQuery インターフェースのインプリメンテーションのインスタンスを作成します。
  3. getCustomersInRegion() メソッドを呼び出して customers という Iterator を作成することによって、Customer 表でカーソルを開きます。
  4. getCustomersInRegion() メソッドで SQL SELECT と一致するレコードが存在する場合は、一致するレコードを取り出して、ID および名前をプリントします。
  5. Iterator と関連付けられたすべてのリソースを閉じて解放します。

インライン・プログラミング・スタイル

SELECT ステートメントをアプリケーションのソースで可視にする場合、インライン・プログラミング・スタイルを使用することができます。

アプリケーションで、Data インターフェースのインプリメンテーションで定義された、多重定義されたバージョンの queryIterator() メソッドを呼び出します。

アプリケーションは、以下のようになります。

Connection con = DriverManager.getConnection(...);          1 
Data db = DataFactory.getData(con);                         2 
Customer c;
int region = 123;
Iterator<Customer> customers = db.queryIterator(            3 
    "SELECT custId, name FROM Customer WHERE region=?1",
    Customer.class, region);
while (customers.hasNext()){                                4 
    c = customers.next();
    System.out.println(c.custId+" "+c.name);
 }
((ResultIterator) customers).close();                       5 

このコードは、以下のステップを実行します。

  1. データベースへの接続を作成します。
  2. Data インターフェースのインプリメンテーションのインスタンスを作成します。
  3. queryIterator メソッドを呼び出して、エレメント・タイプが Customer.class である customers という Iterator を作成することによって、Customer 表でカーソルを開きます。
  4. queryIterator() メソッドで SQL SELECT と一致するレコードが存在する場合は、一致するレコードを取り出して、ID および名前をプリントします。
  5. Iterator と関連付けられたすべてのリソースを閉じて解放します。

フィードバック