Passen Sie über eine Implementierung der Schnittstelle com.ibm.pdq.runtime.handlers.RowHandler<ROW> an, wie pureQuery jede Zeile eines Abfrageergebnisses aus einer SQL-Abfrage zurückgibt.
Die Schnittstelle RowHandler
<ROW> deklariert nur eine Methode:
ROW handle (ResultSet resultSet, ROW object) throws SQLException;
pureQuery ruft für jede Zeile eines Abfrageergebnisses die Methode handle() auf, um das Objekt zu erstellen, das diese Zeile darstellt. pureQuery übergibt die Abfrageergebnisse in einer Instanz von java.sql.ResultSet an die Methode. Dabei befindet sich der Cursor von ResultSet in der aktuellen Zeile. Das Parameterobjekt ist null. Wenn Sie eine Implementierung von RowHandler<ROW> erstellen, implementieren Sie diese Methode, um ein Objekt des Typs <ROW> zu erstellen und zurückzugeben, das die Zeile darstellt, die durch den Cursor der ResultSet-Instanz angegeben ist.
Wenn das ResultSet-Objekt leer ist oder die letzte Zeile des ResultSet-Objekts gelesen wurde, wird die Methode handle() nicht aufgerufen.
Achtung: Vor dem Aufruf der Methode handle() stellt pureQuery den Cursor von ResultSet durch den Aufruf der ResultSet-Methode next() in die aktuelle Zeile. Daher darf Ihre Methode handle nicht die ResultSet-Methode next() aufrufen.
Im folgenden Beispiel enthält das zurückgegebene String-Objekt für jede Zeile in einem Abfrageergebnis eine Reihe von Zeichenfolgewerten jeder Spalte mit Begrenzer. In diesem sehr allgemeinen, einfachen Handler ist keine ausführliche Kenntnis hinsichtlich des Eingabe-ResultSet-Objekts erforderlich.
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
}
RowHandler-Objekte mit mit Annotationen versehenen Methoden verwenden
Es gibt zwei Arten, RowHandler-Objekte für mit Annotationen versehene Methoden anzugeben.
- Annotation @Handler verwenden
- Stellen Sie die Annotation @Handler für die Deklaration einer Methode zusätzlich zur Annotation @Select oder @Update bereit. Geben Sie in der Annotation @Handler die Klasse Ihrer RowHandler-Implementierung an.
Der von Ihnen angegebene Handler muss einen allgemein zugänglichen No-Arg-Konstruktor haben.
pureQuery verwendet den No-Arg-Konstruktor zum Erstellen einer einzelnen Instanz des Handler und diese Instanz wird von allen Aufrufen der mit Annotationen versehenen Methode verwendet.
- Sie könnten z. B. eine mit Annotationen versehene Methode deklarieren, die SimpleStringRowHandler verwendet.
pureQuery instanziiert den Handler mit dem No-Arg-Konstruktor, was bedeutet, dass der Spaltenbegrenzer ", " ist.
@Select(sql = "select * from employee where workdept = ?1.departmentNumber")
@Handler(rowHandler = customHandlers.SimpleStringRowHandler.class)
public Iterator<String> selectEmployeesInDepartment(DepartmentBean department);
- Methodenparameter verwenden
- Sie können die RowHandler-Implementierung auch als Argument in der Definition einer mit Annotationen versehenen Methode angeben. Wenn Ihre Anwendung die Methode aufruft, kann sie die tatsächliche Instanz bereitstellen, die pureQuery verwendet.
- Für Handler, die als Parameter angegeben sind, gelten weniger Einschränkungen als für Handler, die in der Annotation @Handler angegeben sind. Beispielsweise benötigen als Parameter angegebene Handler keinen No-Arg-Konstruktor. Durch die Angabe von Handlern mit der Annotation @Handler verwendet pureQuery jedoch nur eine Instanz eines Handlers für alle Aufrufe der Methode, wodurch pureQuery während der Ausführung weniger Arbeit durchführen muss. Die Annotation @Handler bietet also einen leichten Leistungsvorteil. Daher sollten Sie Handler nur als Methodenparameter angeben, wenn Sie sie nicht über die Annotation @Handler angeben können.
Wenn Sie einen Handler als Parameter angeben, muss der Parameter der letzte Parameter in der Methodenkennung sein. Wenn Sie RowHandler zusammen mit ParameterHandler als Parameter angeben, müssen die Handler die beiden letzten Parameter in der Methodenkennung sein.
Beispielsweise können Sie in einer Schnittstelle eine mit Annotationen versehene Methode definieren, die SimpleStringRowHandler verwendet:
@Select(sql = "SELECT * FROM employee where workdept = ?1.departmentNumber")
Iterator<String> selectEmployeesInDepartment(DepartmentBean department, \
customHandlers.SimpleStringRowHandler rowHandler);
Sie können die Methode über die Angabe einer Instanz von SimpleStringRowHandler aufrufen, die Spalten mit einem Tabulatorzeichen begrenzt:
Iterator<String> employees = face.selectEmployeesInDepartment(theDepartment, new customHandlers.SimpleStringRowHandler("\t"));
Wenn Sie eine einzelne Deklaration einer mit Annotationen versehenen Methode mit mehreren
RowHandler<ROW>-Implementierungen verwenden wollen, können Sie eine mit Annotationen versehene Methode definieren, die die generische RowHandler<ROW>-Implementierung in der Signatur verwendet:
@Select(sql = "SELECT * FROM employee where workdept = ?1.departmentNumber")
<ROW> Iterator<ROW> selectEmployeesInDepartment(DepartmentBean department, RowHandler<ROW> rh);
Sie können dann die Methode aufrufen, indem Sie ein RowHandler-Objekt des erforderlichen Typs übergeben:
Iterator<String> employees = face.selectEmployeesInDepartment(theDepartment, new customHandlers.simpleStringRowHandler("\t"));
RowHandler-Objekte mit integrierten Methoden verwenden
Verwenden Sie zur Angabe von RowHandler für eine integrierte Methode eine der integrierten Methoden, die RowHandler als Parameter einsetzen. Wenn z. B. die Abfrageergebnisse in einer Liste aufgeführt werden sollen, wobei jede Zeile durch eine angepasste
RowHandler-Instanz namens customHandlers.SimpleStringRowHandler erstellt wird, können Sie eine Methode com.ibm.pdq.runtime.Data.queryList(…) aufrufen, die wie im folgenden Beispiel gezeigt RowHandler als Parameter verwendet:
List<EmployeeString> emp = db.queryList("select * from employee where workdept = ?1.departmentNumber",\
new customHandlers.SimpleStringRowHandler("\t"), theDepartment);