Da die Methoden queryArray(), queryIterator() und queryList() ein beinahe identisches Überlastungsmuster aufweisen, basieren die folgenden Beispiele nur auf der Methode queryIterator(). Anders als mit den queryArray()- und queryList()-Methoden wird jedoch mit den queryIterator()-Methoden jeweils eine Zeile abgerufen und Abfrageergebnisse nicht gespeichert. Zwar enthalten Array- und List-Objekte alle Ergebniszeilen, Iterator-Objekte hingegen jeweils nur eine Zeile.
CREATE TABLE company.Customer( CUSTID INTEGER NOT NULL, NAME VARCHAR(75), ADDRESSL1 VARCHAR(60), CITY VARCHAR(35), REGION INTEGER, PRIMARY KEY(CUSTID))
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 Customer { public Integer custId; public String name; public String addressL1; public String city; @Column(name="REGION") public Integer storeRegion }
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 );
Sie können einen RowHandler schreiben (in diesem Beispiel nicht dargestellt), in dem diese Hash-Map und alle Spalten der Tabelle Customer zum Erstellen von Instanzen der Bean com.company.CustomerAddress für Kunden verwendet wird.
public CustomerAddress { public Integer custId; public String name; public String addressL1; public String city; public String state; public Integer zipCode; }
RowHandler wird über die RowHandler-Klasse com.company.Utils.HandleAddress implementiert. Zum Erstellen von Instanzen der Bean mit RowHandler könnten Sie Code wie den folgenden schreiben:
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 );
Es gibt zahlreiche weitere Möglichkeiten, das gleiche Ergebnis zu erzielen. Dies könnte beispielsweise eine Tabelle für die Datenquelle sein, durch die CITY und REGION STATE und ZIP zugeordnet werden. In dieser Situation können Sie die Abfrage als Verknüpfung zwischen der Tabelle company.Customer und dieser Zuordnungstabelle schreiben.
Das Beispiel zeigt, dass RowHandler Anwendungslogik an dem Punkt bereitstellen können, an dem die Daten aus der Datenquelle extrahiert werden, um Objekte einer benötigten Klasse zu erstellen, wenn nicht alle zum Erstellen dieser Objekte erforderlichen Informationen in der Datenquelle verfügbar sind.