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 오브젝트를 지정할 수 있는 방법은 두 가지입니다.
@Select(sql = “select * from employee where workdept = ?1.departmentNumber") @Handler(resultHandler = customHandlers.JSONResultHandler.class) String toJSON(DepartmentBean department);
핸들러를 매개변수로 지정할 때, 매개변수는 메소드 서명에서 마지막 매개변수여야 합니다.
예를 들어, 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));
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));