Rückgabetyp für integrierte Methoden zum Abfragen von Datenbanken: Array-, List- und Iterator-Objekte

Sie können die überladenen Methoden queryArray(), queryIterator() und queryList() der Schnittstelle Data für die Rückgabe des vollständigen Abfrageergebnisses einer Abfrage in Form eines Array-, Iterator- oder List-Objekts verwenden.

Beispiele

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.

In jedem der Beispiele wird folgende Definition für eine Tabelle mit dem Namen 'Customer' verwendet:
CREATE TABLE company.Customer(   
  CUSTID INTEGER NOT NULL,   
  NAME VARCHAR(75),    
  ADDRESSL1 VARCHAR(60),   
  CITY VARCHAR(35),   
  REGION INTEGER,   
  PRIMARY KEY(CUSTID))
public Iterator<Map<String, Object>> queryIterator (java.lang.String sql, Object... parameters);
Von Interesse ist hier die Gesamtzahl der Kunden in den einzelnen Verkaufsregionen, wobei die Informationen zu den größten Regionen an erster Stelle stehen. Der folgende Code gibt die Aggregatzusammenfassung in Form eines Objekts Iterator zurück, das Map-Objekte enthält, wobei jedes Objekt Map die Schlüssel region und customer_count aufweist.
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 <T> Iterator<T> queryIterator (java.lang.String sql, Class<T> returnClass, Object... parameters);
Folgende Bean-Definition, com.company.Customer, wird für einen Kunden vorausgesetzt:
public Customer {
  public Integer custId;
  public String name;
  public String addressL1;
  public String city;
  @Column(name="REGION")
  public Integer storeRegion
}
Sie benötigen detaillierte Informationen zu den Kunden in zwei Regionen, beispielsweise den zwei größten Regionen. Im folgenden Code könnten Sie regionOne und regionTwo auf zwei relevante Regionen festlegen, bevor queryIterator() aufgerufen wird. Die Werte von regionOne und regionTwo würden der Anweisung SELECT übergeben, wenn diese ausgeführt wird, um die zwei Parametermarken in der Klausel WHERE zu ersetzen.
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 benötigen Informationen zum Erstellen einer Mailing-Liste. Angenommen, Sie verfügen über eine Hash-Map, bei der die Schlüssel CITY und REGION zum Auffinden des Bundeslandes und der Postleitzahl einer Stadt verwendet werden.

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.


Feedback