ResultHandler<RES> 인터페이스

pureQuery가 쿼리 결과를 표시하는 오브젝트를 작성하기 위해 사용할 수 있는 com.ibm.pdq.runtime.handlers.ResultHandler<RES> 인터페이스 구현을 작성할 수 있습니다.
ResultHandler<RES> 인터페이스는 하나의 메소드만 선언합니다.
public T handle (ResultSet resultSet);

pureQuery는 handle() 메소드를 호출하여 쿼리 결과를 표시하는 오브젝트를 작성합니다. pureQuery는 java.sql.ResultSet 인스턴스에서 메소드에 쿼리 결과를 전달합니다. ResultHandler<RES>의 구현을 작성 중인 경우, ResultSet 인스턴스의 쿼리 결과를 표시하는 <RES> 유형의 오브젝트를 작성하여 리턴하려면 이 메소드를 구현하십시오.

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

데이터 소스를 쿼리하는 애플리케이션이 전체 쿼리 결과를 String 오브젝트로 다른 애플리케이션에 보낸다고 가정하십시오. 해당하는 다른 애플리케이션에서는 문자열에 일련의 오브젝트가 JSON 형식으로 포함되어 있을 것으로 예상합니다. ResultHandler<RES> 인터페이스의 handle() 메소드를 사용하여 쿼리 결과를 오브젝트의 배열을 표시하는 단일 JSON 문자열로 변환할 수 있습니다.

package customHandlers;

import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;

import com.ibm.pdq.runtime.handlers.ResultHandler;

public class JSONResultHandler implements ResultHandler<String>
{
  // The ResultHandler<RES> interface defines this method
  public String handle (ResultSet rs)
  {
    StringBuffer stringBuffer = new StringBuffer ();
    try {
      ResultSetMetaData resultSetMetaData = rs.getMetaData ();
      int columnCount = resultSetMetaData.getColumnCount ();
      boolean first = true;
      stringBuffer.append ("[");
      while (rs.next ()) {
        // All row objects, except the last, are followed by a ","
        if (!first) stringBuffer.append (",");
        first = false;
        stringBuffer.append ("{");
        for (int x = 1; x <= columnCount; x++) {
          stringBuffer.append ("\"");
          stringBuffer.append (toJSONString (resultSetMetaData.getColumnLabel (x)));
          stringBuffer.append ("\":\"");
          stringBuffer.append (toJSONString (rs.getString (x)));
          stringBuffer.append ("\"");
          if (x < columnCount) stringBuffer.append (",");
        }
        stringBuffer.append ("}");
      }
      stringBuffer.append ("]");
    }
    		catch (SQLException e) {
      throw new RuntimeException ("The JSONResultHandler failed to create a JSON string from the query results.", e);
    }
    return stringBuffer.toString ();
  }

  private String toJSONString (String value)
  {
    if (value != null) {
      int valueLength = value.length ();
      StringBuffer sb = new StringBuffer (valueLength);
      for (int i = 0; i < valueLength; i++) {
        char c = value.charAt (i);
        switch (c) {
          case '\\':
            sb.append ("\\\\");
          break;
          case '"':
            sb.append ("\\\"");
          break;
          case '/':
            sb.append ("\\/");
          break;
          case 0x08:
            sb.append ("\\b");
          break;
          case 0xC:
            sb.append ("\\f");
          break;
          case 0xA:
            sb.append ("\\n");
          break;
          case 0xD:
            sb.append ("\\r");
          break;
          case 0x9:
            sb.append ("\\t");
          break;
          default:
            sb.append (c);
          break;
        }
      }
      return sb.toString ();
    }
    else
      return null;
  }

}

다음은 JSONResultHandler가 생성할 수 있는 JSON 문자열의 예입니다.

[{"DEPTNO":"A00","DEPTNAME":"SPIFFY COMPUTER SERVICE DIV.","MGRNO":"000010","ADMRDEPT":"A00","LOCATION":"null"},
{"DEPTNO":"B01","DEPTNAME":"PLANNING","MGRNO":"000020",
"ADMRDEPT":"A00","LOCATION":"null"},...]

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

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

@Handler 어노테이션 사용
메소드의 정의에 @Select 또는 @Update 어노테이션을 사용하는 것 외에, @Handler 어노테이션을 제공합니다. @Handler 어노테이션에서 ResultHandler 구현의 클래스를 지정합니다. 지정하는 핸들러에는 인수 없는 공용 구성자가 있어야 합니다. pureQuery는 인수 없는 구성자를 사용하여 핸들러의 단일 인스턴스를 작성하고, 그 인스턴스는 어노테이션이 있는 메소드의 모든 호출에서 사용됩니다.
예를 들어, JSONResultHandler를 사용하는 어노테이션이 있는 메소드를 선언할 수 있습니다. pureQuery는 인수 없는 구성자로 핸들러의 인스턴스를 생성합니다.
@Select(sql = “select * from employee where workdept = ?1.departmentNumber") 
@Handler(resultHandler = customHandlers.JSONResultHandler.class) 
String toJSON(DepartmentBean department);
메소드 매개변수 사용
다른 방법으로, 어노테이션이 있는 메소드 정의의 매개변수로 ResultHandler 구현을 지정할 수 있습니다. 애플리케이션이 메소드를 호출할 때 사용할 pureQuery에 대한 실제 인스턴스를 제공할 수 있습니다.

핸들러를 매개변수로 지정할 때, 매개변수는 메소드 서명에서 마지막 매개변수여야 합니다.

예를 들어, Iterator<EmployeeBean>에서 쿼리 결과를 가져오려고 했으며 결과의 11 - 20 행을 포함할 Iterator<EmployeeBean>을 원한다고 합시다. com.ibm.pdq.runtime.data.handlers.IteratorPagingResultHandler<RES>를 사용할 수 있습니다. 인터페이스에서, 매개변수로 IteratorPagingResultHandler<RES>의 인스턴스를 사용하는 어노테이션이 있는 메소드를 정의할 수 있습니다.

@Select(sql = "select * from employee where workdept = ?1.departmentNumber")
  Iterator<EmployeeBean> selectEmployeesInDepartment(DepartmentBean department, IteratorPagingResultHandler resultHandler);

결과를 11 - 20 행만 가져오려면 다음과 같은 메소드를 호출할 수 있습니다.

// Execute the query and create an iterator for rows 11-20
Iterator<EmployeeBean> employees = face.selectEmployeesInDepartment(theDepartment, new IteratorPagingResultHandler(EmployeeBean.class, 11, 20));

여러 개의 ResultHandler<RES> 구현이 있는 단일 어노테이션이 있는 메소드 선언을 사용하려는 경우, 서명에서 일반 ResultHandler<RES>를 사용하는 어노테이션이 있는 메소드를 정의할 수 있습니다.

@Select(sql = "select * from employee where workdept = ?1.departmentNumber")
  <RES> RES selectEmployeesInDepartment(DepartmentBean department, ResultHandler<RES> resultHandler);

그러면, 특정 유형의 ResultHandler 오브젝트를 전달하여 메소드를 호출할 수 있습니다.

Iterator<EmployeeBean> employee = face.selectEmployeesInDepartment(theDepartment, new IteratorPagingResultHandler(EmployeeBean.class, 11, 20));

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

Iterator<EmployeeBean>에서 쿼리 결과를 가져오려고 했으며 결과의 11 - 20 행을 포함할 Iterator<EmployeeBean> 을 원한다고 합시다. com.ibm.pdq.runtime.data.handlers.IteratorPagingResultHandler<RES>를 사용할 수 있습니다. 매개변수로 IteratorPagingResultHandler<RES>의 인스턴스를 사용하는 인라인 메소드를 정의할 수 있습니다.
Connection con = DriverManager.getConnection(...);
  Data d = DataFactory.getData(con);

// Execute the query and create an iterator for rows 11-20
  Iterator<EmployeeBean> employees = d.query("select * from employee where workdept = ?1.departmentNumber",
         theDepartment, new IteratorPagingResultHandler(EmployeeBean.class,11, 20));

피드백