Exécution d'une requête simple afin de produire un Iterator d'objets

Cet exemple vous explique comment vous pouvez utiliser pureQuery pour rechercher tous les clients dans une zone de vente particulière.

Définition de la table de base de données et du bean correspondant

Cet exemple utilise la définition simple suivante d'une table appelée SALES.CUSTOMER.

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

Un bean simple correspondant à cette table peut se présenter comme suit.

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

Style de programmation de méthode annotée

Lorsque vous utilisez des méthodes annotées pour manipuler un objet de base de données, vous devez définir une interface définissant ces méthodes, utiliser le générateur pureQuery pour générer une implémentation de cette interface, puis écrire une application appelant les méthodes se trouvant dans la classe d'implémentation.

Pour une requête permettant de renseigner un itérateur avec des objets client pour des clients se trouvant dans une zone de vente particulière, vous pouvez définir une interface comme celle-ci :

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

L'interface définit la méthode getCustomersInRegion() comme renvoyant un Iterator des objets com.company.Customer, en se basant sur un paramètre int unique identifiant la zone dans laquelle les clients se trouvent.

L'annotation @Select définit la requête SQL qui renseigne l'Iterator renvoyé de la fonction, en se basant sur l'égalité entre la colonne de la zone de la table CUSTOMER et le premier paramètre d'entrée de la fonction, marqué de la valeur ?1.

Une fois que vous avez défini l'interface, vous pouvez exécuter le générateur pureQuery pour générer une implémentation de cette interface. Le nom de l'implémentation est CustomerQueryImpl. Le module de l'implémentation est le module qui contient l'interface CustomerQuery.

Une fois que vous avez généré une implémentation de l'interface CustomerQuery, vous pouvez l'utiliser dans une application comme celle ci :

 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 

Le code exécute les étapes suivantes :

  1. Créer une connexion à la base de données.
  2. Créer une instance de l'implémentation de l'interface CustomerQuery.
  3. Ouvrir un curseur de la table Customer en appelant la méthode getCustomersInRegion() et en créant un Iterator appelé customers.
  4. Tant qu'il y a un enregistrement qui correspond à la requête SQL SELECT dans la méthode getCustomersInRegion(), récupérer un enregistrement correspondant et imprimer l'ID et le nom.
  5. Fermer et libérer toutes les ressources associées à l'Iterator.

Style de programmation intégrée

Si vous souhaitez que l'instruction SELECT soit visible dans la source de l'application, vous pouvez utiliser le style de programmation intégrée.

Dans votre application, vous appelez une version de la méthode queryIterator() surchargée définie dans une implémentation de l'interface Data.

Votre application peut se présenter comme suit :

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 

Le code exécute les étapes suivantes :

  1. Création d'une connexion à la base de données.
  2. Création d'une instance d'une implémentation de l'interface Data.
  3. Ouverture d'un curseur sur la table Customer en appelant la méthode queryIterator() et en créant un Iterator appelé customers avec des éléments de type Customer.class.
  4. Tant qu'il y a un enregistrement qui correspond à la requête SQL SELECT dans la méthode queryIterator(), récupération d'un enregistrement correspondant et impression de l'ID et du nom.
  5. Fermeture et libération de toutes les ressources associées à l'Iterator.

Commentaires