データベースを照会するインライン・メソッドの戻りの型: ArrayList、および Iterator オブジェクト

Data インターフェースの多重定義された queryArray()queryIterator()、および queryList() メソッドを使用して、照会の照会結果全体を ArrayIterator、または List オブジェクトとして戻すことができます。

queryArray()queryIterator()、および queryList() メソッドの多重定義のパターンはほとんど同じであるため、以下に示す例は queryIterator() メソッドのみを基にしています。 ただし、queryArray() および queryList() メソッドとは異なり、queryIterator() メソッドは、同時に 1 行フェッチし、照会結果をマテリアライズしません。 Array および List オブジェクトは、すべての結果行を保持しますが、Iterator オブジェクトは同時に 1 行しか保持しません。

それぞれの例は、Customer という表に対して以下の定義を使用します。
CREATE TABLE company.Customer(   
  CUSTID INTEGER NOT NULL,   
  NAME VARCHAR(75),    
  ADDRESSL1 VARCHAR(60),   
  CITY VARCHAR(35),   
  REGION INTEGER,   
  PRIMARY KEY(CUSTID))
public Iterator<Map<String, Object>> queryIterator (java.lang.String sql, Object... parameters);
各販売地域に住んでいる顧客の合計数を知りたい場合があるかもしれません。この場合、最も広い地域に関する情報が最初に表示されます。 以下のコードは、Map オブジェクトが含まれる Iterator オブジェクトとして集約サマリーを戻します。それぞれの Map にはキー region および customer_count が含まれます。
Connection con = DriverManager.getConnection(...);
Data db = DataFactory.getData(con);
Iterator<Map<String, Object>> regionSize =  
   db.queryIterator(
       "SELECT REGION, COUNT(*) AS CUSTOMER_COUNT " +
       " FROM company.Customer GROUP BY REGION " +
       " ORDER BY CUSTOMER_COUNT DESC" );
public <T> Iterator<T> queryIterator (java.lang.String sql, Class<T> returnClass, Object... parameters);
以下の顧客用の Bean 定義 com.company.Customer が存在するとします。
public Customer {
  public Integer custId;
  public String name;
  public String addressL1;
  public String city;
  @Column(name="REGION")
  public Integer storeRegion
}
2 つの地域 (おそらく最も広い 2 つの地域) に住んでいる顧客に関する詳細情報が必要な場合があります。 以下のコードでは、queryIterator() を呼び出す前に、regionOne および regionTwo を関心のある地域に設定できます。 regionOne および regionTwo の値は実行時に SELECT ステートメントに渡され、WHERE 節で 2 つのパラメーター・マーカーの代わりをします。
Connection con = DriverManager.getConnection(...);
Data db = DataFactory.getData(con);
Integer regionOne = ...;
Integer regionTwo = ...;
Iterator<com.company.Customer> twoRegions = db.queryIterator(
   "SELECT CUSTID, NAME, ADDRESSL1, CITY, REGION" +
   " FROM company.Customer WHERE REGION IN (?, ?)"
   com.company.Customer.class, regionOne, regionTwo );
メーリング・リストを作成するための情報が必要な場合があります。 CITY および REGION のキーを使用して、都市の対応する都道府県および郵便番号を見つけるハッシュ・マップが使用できるとします。

そのハッシュ・マップおよび Customer 表のすべての列を使用する RowHandler (以下の例には示されない) を作成して、顧客用の com.company.CustomerAddress Bean のインスタンスを作成することができます。

public CustomerAddress {
  public Integer custId;
  public String name;
  public String addressL1;
  public String city;
  public String state;
  public Integer zipCode;
}

RowHandler であるクラス com.company.Utils.HandleAddress は、RowHandler を実装します。RowHandler を使用して Bean のインスタンスを作成するには、以下のようなコードを書くことができます。

Connection con = DriverManager.getConnection(...);
Data db = DataFactory.getData(con);
Integer regionOne = ...;
Integer regionTwo = ...;
RowHandler<com.company.CustomerAddress> addAddress =
                     new com.company.Utils.HandleAddress();
 
Iterator<com.company.CustomerAddress> twoRegions = 
   db.queryIterator(
     "SELECT CUSTID, NAME, ADDRESSL1, CITY, REGION" +
     " FROM company.Customer WHERE REGION IN (?, ?)"
     addAddress, regionOne, regionTwo );

同じ結果を生成する方法はほかにも数多くあります。 例えば、CITY および REGION を STATE および ZIP にマップするデータ・ソース上の表が存在する場合があります。この場合、company.Customer 表とそのマッピング表の結合として照会を書くことができます。

この例は、データがデータ・ソースから抽出された時点で、RowHandlers がアプリケーション・ロジックを提供できることを単に示しています。これにより、RowHandlers は、必要なクラスのオブジェクトの生成に必要なすべての情報がデータ・ソース上で使用できない場合でも、それらのオブジェクトを生成することができます。


フィードバック