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