Type de renvoi pour les méthodes intégrées qui interrogent des bases de données : objets Array, List et Iterator

Vous pouvez utiliser les méthodes surchargées queryArray(), queryIterator() et queryList() de l'interface Data pour renvoyer un résultat de requête entier sous forme d'objet Array, Iterator ou List.

Exemples

Dans la mesure où les méthodes queryArray(), queryIterator() et queryList() possèdent un modèle presque identique de surcharge, les exemples suivants reposent uniquement sur la méthode queryIterator(). Toutefois, contrairement aux méthodes queryArray() et queryList(), les méthodes queryIterator() n'extraient qu'une ligne à la fois et ne matérialisent pas les résultats de la requête. Bien que les objets Array et List contiennent toutes les lignes résultantes, les objets Iterator contiennent une seule ligne à la fois.

Chacun des exemples utilise cette définition pour un tableau nommé Customer :
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);
Vous souhaitez peut-être connaître le nombre total de clients dans chaque région de vente, les informations sur les régions les plus vastes étant présentées en premier. Le code suivant renvoie le récapitulatif d'agrégat sous la forme d'un objet Iterator contenant des objets Map, chaque Map possédant des clés region et customer_count.
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);
Supposons que la définition de bean suivante, com.company.Customer, s'applique à un client :
public Customer {
  public Integer custId;
  public String name;
  public String addressL1;
  public String city;
  @Column(name="REGION")
  public Integer storeRegion
}
Vous pourriez avoir besoin d'informations détaillées concernant les clients dans deux régions, peut-être les deux régions les plus vastes. Dans le code suivant, vous pourriez définir regionOne et regionTwo sur les régions d'intérêt avant l'appel de queryIterator(). Les valeurs de regionOne et regionTwo seraient transmises à l'instruction SELECT, lorsqu'elle est utilisée, afin de prendre la place des deux marqueurs de paramètre dans la clause WHERE.
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 );
Vous pourriez avoir besoin d'informations pour créer une liste de diffusion. Supposons que vous disposez d'une mappe de hachage utilisant une clé CITY et REGION pour localiser l'état et le code postal correspondant à une ville.

Vous pourriez écrire un RowHandler (non illustré dans cet exemple) utilisant cette mappe de hachage et toutes les colonnes de la table Customer pour créer des instances du bean com.company.CustomerAddress pour les clients.

public CustomerAddress {
  public Integer custId;
  public String name;
  public String addressL1;
  public String city;
  public String state;
  public Integer zipCode;
}

Le RowHandler, classe com.company.Utils.HandleAddress, implémente RowHandler. Pour créer des instances du bean à l'aide de RowHandler, vous pourriez écrire un code du type suivant :

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 );

Il existe de nombreuses autres manières de produire le même résultat. Prenons l'exemple d'une table dans la source de données qui mappe CITY et REGION à STATE et ZIP. Dans cette situation, vous pouvez écrire la requête sous la forme d'une liaison entre la table company.Customer et cette table de mappage.

L'exemple montre simplement que les RowHandlers peuvent fournir une logique d'application au point où les données sont extraites de la source de données, pour produire des objets d'une classe requise lorsque toutes les informations nécessaires pour produire ces objets ne sont pas disponibles dans la source de données.


Commentaires