RowHandler<ROW> 인터페이스

com.ibm.pdq.runtime.handlers.RowHandler<ROW> 인터페이스의 구현을 사용하여, pureQuery가 SQL 쿼리의 쿼리 결과 행을 각각 리턴하는 방법을 사용자 정의할 수 있습니다.
RowHandler<ROW> 인터페이스는 하나의 메소드만 선언합니다.
ROW handle (ResultSet resultSet, ROW object) throws SQLException;

pureQuery는 쿼리 결과의 각 행마다 handle() 메소드를 호출하여 해당 행을 표시하는 오브젝트를 작성합니다. pureQuery는 현재 행에 ResultSet 커서를 위치시킨 상태에서 java.sql.ResultSet 인스턴스의 쿼리 결과를 메소드에 전달합니다. 매개변수 오브젝트는 널입니다. RowHandler<ROW>의 구현을 작성 중인 경우, ResultSet 인스턴스의 커서로 지시된 행을 표시하는 <ROW> 유형의 오브젝트를 작성하여 리턴하려면 이 메소드를 구현하십시오.

ResultSet 오브젝트가 비어 있거나 ResultSet 오브젝트의 마지막 행을 읽은 경우, handle() 메소드는 호출되지 않습니다.

주의: pureQuery가 handle() 메소드를 호출하기 전에, pureQuery는 ResultSet의 next() 메소드를 호출하여 현재 행에 ResultSet의 커서를 위치시킵니다. 따라서 handle 메소드는 ResultSet의 next() 메소드를 호출할 수 없습니다.

이 예에서, 쿼리 결과의 각 행에 대해 리턴된 String 오브젝트는 각 컬럼의 구분된 일련의 문자열 값을 포함합니다. 이 일반적이고 단순한 핸들러에서는 입력 ResultSet 오브젝트에 관한 자세한 지식이 필요하지 않습니다.

package customHandlers;

import com.ibm.pdq.runtime.handlers.RowHandler;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;


   public class SimpleStringRowHandler implements RowHandler<String>
 {
   public SimpleStringRowHandler ()
   {
     delimiter = ", ";
   }

   public SimpleStringRowHandler (String delimiter)
   {
     this.delimiter = delimiter;
   }

   private int columnCount = -1;
   private String delimiter;
   String handle (ResultSet resultSet, java.lang.String object) throws SQLException
   {
     if (columnCount < 0)
       columnCount = resultSet.getMetaData().getColumnCount();
     StringBuffer myBuff = new StringBuffer();
     if (columnCount > 0) {
       myBuff.append(resultSet.getString(1));
       for (int ii=2; ii<=columnCount; ii++) {
         myBuff.append(delimiter);
         myBuff.append(resultSet.getString(ii)));
       }
     }
     return myBuff.toString();
   }  // handle
 }

어노테이션이 있는 메소드에 ResultHandler 오브젝트 사용

어노테이션이 있는 메소드에 대해 RowHandler 오브젝트를 지정할 수 있는 방법은 두 가지입니다.

@Handler 어노테이션 사용
메소드의 정의에 @Select 또는 @Update 어노테이션과 함께 @Handler 어노테이션을 제공합니다. @Handler 어노테이션에서 ResultHandler 구현의 클래스를 지정합니다. 지정하는 핸들러에는 인수 없는 공용 구성자가 있어야 합니다. pureQuery는 인수 없는 구성자를 사용하여 핸들러의 단일 인스턴스를 작성하고, 그 인스턴스는 어노테이션이 있는 메소드의 모든 호출에서 사용됩니다.
예를 들어, SimpleStringRowHandler를 사용하는 어노테이션이 있는 메소드를 선언할 수 있습니다. pureQuery는 인수 없는 구성자로 핸들러의 인스턴스를 생성합니다(컬럼 분리문자가 ", "임을 의미합니다).
@Select(sql = "select * from employee where workdept = ?1.departmentNumber") 
@Handler(rowHandler = customHandlers.SimpleStringRowHandler.class) 
public Iterator<String> selectEmployeesInDepartment(DepartmentBean department);
메소드 매개변수 사용
다른 방법으로, 어노테이션이 있는 메소드 정의의 인수로 RowHandler 구현을 지정할 수 있습니다. 응용프로그램이 메소드를 호출할 때 사용할 pureQuery에 대한 실제 인스턴스를 제공할 수 있습니다.
매개변수로 지정된 핸들러에는 @Handler 어노테이션에 지정된 것만큼의 제한사항이 있지는 않습니다. 예를 들어, 매개변수로 지정된 핸들러에는 인수 없는 구성자가 없어도 됩니다. 그러나 @Handler 어노테이션으로 핸들러를 지정하면 pureQuery가 메소드의 모든 호출에 핸들러의 인스턴스 하나만을 사용하므로 pureQuery가 런타임 시 더 적게 작업을 수행해야 합니다. 따라서 @Handler 어노테이션은 약간의 성능 이점만 제공하므로, @Handler 어노테이션을 사용하여 메소드 매개변수를 지정할 수 없는 경우에만 메소드 매개변수로 핸들러를 지정해야 합니다.

핸들러를 매개변수로 지정할 때, 매개변수는 메소드 서명에서 마지막 매개변수여야 합니다. RowHandler를 ParameterHandler와 함께 매개변수로 지정하는 경우, 핸들러는 메소드 서명에서 마지막 두 개의 매개변수여야 합니다.

예를 들어, 인터페이스에서 SimpleStringRowHandler를 사용하는 어노테이션이 있는 메소드를 정의할 수 있습니다.
@Select(sql = "SELECT * FROM employee where workdept = ?1.departmentNumber")
Iterator<String> selectEmployeesInDepartment(DepartmentBean department, \
	customHandlers.SimpleStringRowHandler rowHandler);
탭 문자로 컬럼을 분리하는 SimpleStringRowHandler의 인스턴스를 지정하여 메소드를 호출할 수 있습니다.
Iterator<String> employees = face.selectEmployeesInDepartment(theDepartment, new customHandlers.SimpleStringRowHandler("\t"));
여러 개의 RowHandler<ROW> 구현이 있는 단일 어노테이션이 있는 메소드 선언을 사용하려는 경우, 서명에서 일반 RowHandler<ROW>를 사용하는 어노테이션이 있는 메소드를 정의할 수 있습니다.
@Select(sql = "SELECT * FROM employee where workdept = ?1.departmentNumber")
  <ROW> Iterator<ROW> selectEmployeesInDepartment(DepartmentBean department, RowHandler<ROW> rh);
그러면, 필요한 유형의 RowHandler 오브젝트를 전달하여 메소드를 호출할 수 있습니다.
Iterator<String> employees = face.selectEmployeesInDepartment(theDepartment, new customHandlers.simpleStringRowHandler("\t"));

인라인 메소드에 ResultHandler 오브젝트 사용

인라인 메소드에 RowHandler를 지정하려면 매개변수로 RowHandler를 사용하는 인라인 메소드 중 하나를 사용하십시오. 예를 들어, customHandlers.SimpleStringRowHandler라고 하는 사용자 정의 RowHandler에 의해 각 행이 작성된 목록에 쿼리 결과가 있기를 원하면, 다음 예와 같은 매개변수로 RowHandler를 사용하는 com.ibm.pdq.runtime.Data.queryList(…) 메소드를 호출할 수 있습니다.
List<EmployeeString> emp = db.queryList("select * from employee where workdept = ?1.departmentNumber",\
     new customHandlers.SimpleStringRowHandler("\t"), theDepartment);

피드백