데이터베이스를 쿼리하는 인라인 메소드의 리턴 유형: Array, ListIterator 오브젝트

Data 인터페이스의 오버로드된 queryArray(), queryIterator()queryList() 메소드를 사용하여 쿼리의 전체 쿼리 결과를 Array, Iterator 또는 List 오브젝트로 리턴할 수 있습니다.

예제

queryArray(), queryIterator()queryList() 메소드의 오버로드 패턴이 거의 동일하므로 다음 예제는 queryIterator() 메소드만 기본으로 합니다. 그러나 queryArray()queryList() 메소드와 다르게 queryIterator() 메소드는 한번에 하나의 행을 페치하고 쿼리 결과를 구체화하지 않습니다. ArrayList 오브젝트는 모든 결과 행을 보유하지만, Iterator 오브젝트는 한 번에 하나의 행만 보유합니다.

각 예제에서는 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에는 regioncustomer_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);
고객에 대해 다음과 같은 com.company.Customer Bean 정의를 가정하십시오.
public Customer {
  public Integer custId;
  public String name;
  public String addressL1;
  public String city;
  @Column(name="REGION")
  public Integer storeRegion
}
두 지역(아마도 가장 큰 지역)의 고객에 관한 자세한 정보가 필요할 수 있습니다. 다음 코드에서 queryIterator()를 호출하기 전에 regionOneregionTwo를 관심 지역으로 설정할 수 있습니다. regionOneregionTwo의 값이 SELECT문에 전달되어 해당 명령문이 실행될 때 WHERE절에서 두 매개변수 표시문자를 대신합니다.
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 );
메일링 리스트를 작성하기 위해 정보가 필요할 수 있습니다. 도시의 해당 주 및 우편번호를 찾기 위해 CITYREGION 키를 사용하는 해시 Map을 사용할 수 있다고 가정하십시오.

해당 해시 Map과 Customer 테이블의 모든 컬럼을 사용하여 고객에 대한 com.company.CustomerAddress Bean의 인스턴스를 작성하는 RowHandler(이 예제에서는 표시되지 않음)를 작성할 수 있습니다.

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 테이블과 해당 맵핑 테이블 간의 조인으로 쿼리를 작성할 수 있습니다.

예제에서는 필요한 클래스의 오브젝트를 작성하는 데 필요한 모든 정보를 데이터 소스에서 사용할 수 없는 경우에 데이터가 데이터 소스에서 추출된 지점에 RowHandler가 애플리케이션 논리를 제공하여 해당 오브젝트를 작성할 수 있음을 간단히 설명합니다.


피드백