Einfache Abfrage zum Erstellen eines Iterators von Objekten ausführen

Dieses Beispiel zeigt, wie Sie mithilfe von pureQuery alle Kunden in einer bestimmten Verkaufsregion ermitteln können.

Definition der Datenbanktabelle und der entsprechenden Bean

In diesem Beispiel wird die folgende einfache Definition einer Tabelle mit dem Namen SALES.CUSTOMER verwendet.

CREATE TABLE SALES.CUSTOMER (
 CUSTID BIGINT NOT NULL,
 NAME VARCHAR(24),
 ADDRESSL1 VARCHAR(50),
 CITY VARCHAR(24),
 REGION BIGINT,
 PRIMARY KEY(CUSTID))

Eine einfache Bean, die dieser Tabelle entspricht, könnte wie folgt aussehen:

public Customer {
    public Integer custId;
    public String name;
    public String addressL1;
    public String city;
    public Integer region;
 }

Programmierstil mit Annotationsmethode

Wenn Sie mit Annotationen versehene Methoden zum Manipulieren eines Datenbankobjekts verwenden, müssen Sie eine Schnittstelle definieren, die diese Methoden definiert. Verwenden Sie das pureQuery-Dienstprogramm Generator, um eine Implementierung dieser Schnittstelle zu generieren und schreiben Sie anschließend eine Anwendung, die die in der Implementierungsklasse enthaltenen Methoden aufruft.

Damit eine Abfrage einen Iterator mit Customer-Objekten für Kunden in einer bestimmten Verkaufsregion füllt, könnten Sie eine Schnittstelle wie die folgende definieren:

 import com.company.Customer; 
 public interface CustomerQuery
 {
   @Select(sql=
    "SELECT * FROM Customer WHERE region=?1")
   Iterator<Customer> getCustomersInRegion(int r);
 }

Die Schnittstelle definiert die Methode getCustomersInRegion(), die einen Iterator von com.company.Customer-Objekten zurückgibt, basierend auf einem einzelnen Parameter int, der die Region angibt, in der sich die Kunden befinden.

Die Annotation @Select gibt die SQL-Abfrage an, durch die der zurückgegebene Iterator der Funktion gefüllt wird, basierend auf der Gleichheit zwischen der Regionsspalte der Tabelle CUSTOMER und dem ersten Eingabeparameter der Funktion, der mit ?1 gekennzeichnet ist.

Nach Definition der Schnittstelle können Sie das pureQuery-Dienstprogramm Generator ausführen, um eine Implementierung dieser Schnittstelle zu generieren. Der Name der Implementierung ist CustomerQueryImpl. Das Paket für die Implementierung ist das Paket, das die Schnittstelle CustomerQuery enthält.

Nach Generieren einer Implementierung der Schnittstelle CustomerQuery können Sie sie in einer Anwendung wie der folgenden verwenden:

 Connection con = DriverManager.getConnection(...);          1 
 CustomerQuery cqcQuery = 
     DataFactory.getData( CustomerQuery.class, con );                   2 
 Customer c;
 int r = 123;
 Iterator<Customer> customers =                        3 
                      cqcQuery.getCustomersInRegion(r);
 while (customers.hasNext()){                                4 
    c = customers.next();
    System.out.println(c.custId+" "+c.name);
 }
 ((ResultIterator) customers).close();                       5 

Der Code führt die folgenden Schritte aus:

  1. Stellt eine Verbindung zur Datenbank her.
  2. Erstellt eine Instanz der Implementierung der Schnittstelle CustomerQuery.
  3. Ruft die Methode getCustomersInRegion() auf und erstellt einen Iterator mit dem Namen customers, um einen Cursor für die Tabelle Customer zu öffnen.
  4. Ruft einen übereinstimmenden Datensatz ab und gibt ID und Name aus, sofern ein Datensatz vorhanden ist, der mit der SQL-Anweisung SELECT in der Methode getCustomersInRegion() übereinstimmt.
  5. Schließt alle dem Iterator zugeordneten Ressourcen und gibt sie frei.

Integrierter Programmierstil

Wenn Sie wollen, dass die Anweisung SELECT im Quellcode der Anwendung sichtbar ist, können Sie den integrierten Programmierstil verwenden.

Dazu würden Sie in der Anwendung eine Version der überladenen Methode queryIterator() aufrufen, die in einer Implementierung der Schnittstelle Data definiert ist.

Ihre Abfrage könnte wie folgt aussehen:

Connection con = DriverManager.getConnection(...);          1 
Data db = DataFactory.getData(con);                         2 
Customer c;
int region = 123;
Iterator<Customer> customers = db.queryIterator(            3 
    "SELECT custId, name FROM Customer WHERE region=?1",
    Customer.class, region);
while (customers.hasNext()){                                4 
    c = customers.next();
    System.out.println(c.custId+" "+c.name);
 }
((ResultIterator) customers).close();                       5 

Der Code führt die folgenden Schritte aus:

  1. Stellt eine Verbindung zur Datenbank her.
  2. Erstellt eine Instanz einer Implementierung der Datenschnittstelle.
  3. Ruft die Methode queryIterator() auf und erstellt einen Iterator mit dem Namen customers mit Elementen des Typs Customer.class, um einen Cursor für die Tabelle Customer zu öffnen.
  4. Ruft einen übereinstimmenden Datensatz ab und gibt ID und Name aus, sofern ein Datensatz vorhanden ist, der mit der SQL-Anweisung SELECT in der Methode queryIterator() übereinstimmt.
  5. Schließen Sie alle dem Iterator zugeordneten Ressourcen und geben Sie sie frei.

Feedback