In diesem Beispiel ist die Objektgruppe ein Objekt java.util.List und eine Implementierung der Schnittstelle java.lang.Iterable. Wenn Sie eine gespeicherte Liste von Customer-Objekten zurückgeben, können Sie mehrere Fragen über diese Daten stellen, ohne dass Sie erneut auf die verbundene Datenquelle zugreifen müssen.
Angenommen, Sie wollen herausfinden, wie viele Kunden es in der Verkaufsregion San Francisco Bay Area gibt. Ihr Code könnte wie folgt aussehen:
Connection con = DriverManager.getConnection(...); 1 Data db = DataFactory.getData(con); 2 Data qocdata = DataFactory.getData(); 3 List<Customer> customers = db.queryList( 4 "SELECT * from SALES.CUSTOMER", Customer.class); db.close(); 5 int sanFranCode = ... 6 Integer countCity = qocdata.queryFirst( 7 "SELECT COUNT(*) FROM ?1.com.company.Customer AS cr WHERE cr.storeRegion = ?2", Integer.class, customers, sanFranCode ); qocdata.close(); 8
Der Code führt die folgenden Schritte aus:
Statt qocdata zu schließen, können Sie zusätzliche Analysen der Kunden wie die im nächsten Beispiel gezeigte ausführen.
Angenommen, Sie benötigen für einen Bericht an das Management die Anzahl von Städten in der Verkaufsregion San Francisco Bay Area und die Namen der fünf größten Städte (gemessen an der Anzahl verschiedener Adressen) in dieser Region. Dann soll nach Genehmigung durch das Management eine Mailing-Kampagne für Kunden in diesen Städten gestartet werden.
Sie können eine Abfrage einer verbundenen Datenquelle und eine kleine Menge Anwendungslogik, die mit Annotationen versehene Methoden nutzt, um drei Abfragen über Objektgruppen einzubinden, verwenden.
Zuerst benötigen Sie eine Zwischenspeicherungsklasse, die von der aufrufenden Anwendung und den mit Annotationen versehenen Methoden verwendet wird:
public class CitySize { public String city; public Integer size; }
Da Sie die Methoden nicht in einer Implementierungsklasse für Abfragen über Objektgruppen mit Abfragen von Datenbanken verwenden können, müssen Sie zwei verschiedene Schnittstellen erstellen.
Die Schnittstelle CustomerQuery definiert die Methode zum Abfragen der Datenquelle. Die Methode getCustomersInRegion() gibt eine Liste von Customer-Objekten zurück, die Kunden in einer angegebenen Verkaufsregion darstellen.
import com.company.Customer; public interface CustomerQuery { @Select(sql= "SELECT custId, name, ... FROM Customer WHERE region=?1") List<Customer> getCustomersInRegion(int r); }
Die Schnittstelle RegionReport definiert die Methoden zum Abfragen des Objektgruppenobjekts.
import com.company.Customer; import com.company.Campaign.CitySize; public interface RegionReport { @Select(sql="SELECT COUNT(DISTINCT city) FROM ?1") public Integer countCities (List<Customer> curRegion); @Select(sql= "SELECT city, COUNT(DISTINCT addressL1) AS size " + " FROM ?1 GROUP BY city ORDER BY size DESC") public CitySize[] getCitySize(List<Customer> curRegion); @Select(sql="SELECT cr.this FROM ?1 AS cr, ?2 AS t5 " + " WHERE cr.city = t5.city ") List<Customer> getMailingList(List<Customer> curRegion, CitySize[] topFive); }
Nachdem Sie Implementierungsklassen für die Schnittstelle generiert haben, können Sie den Bericht an das Management und die Liste der anvisierten Kunden mit Anwendungslogik, die wie folgt aussieht, erzeugen:
Connection con = DriverManager.getConnection(...); 1 CustomerQuery cQuery = DataFactory.getData( CustomerQuery.class, con ); 2 RegionReport inMem = DataFactory.getData( RegionReport.class ); 3 int sanFranCode = ...; 4 List<Customer> customers = cQuery.getCustomersInRegion(sanFranCode); 5 cQuery.close(); 6 Integer cityCount = inMem.countCities(customers); 7 System.out.println ( 8 " There are " + cityCount + " cities in region " + sanFranCode ); System.out.println ( " The largest 5, and their number of addresses are: " ); CitySize[] allCityList = inMem.getCitySize(customers); 9 CitySize[] topFive = new CitySize[5]; 10 for (int i=0; i<5; i++) 11 { topFive[i] = allCityList[i]; System.out.println ( " " + topFive[i].city + " " + topFive[i].size); } List<Customer> mailingCust = 12 inMem.getMailingList(customers, topFive); inMem.close(); 13
Der Code führt die folgenden Schritte aus:
Wenn das Management entscheidet, dass das Zielmailing zu klein oder zu groß ist, ist lediglich eine kleine Änderung bei der zugewiesenen Größe des Arrays CitySize und der Schleife, die Daten in es schreibt, erforderlich, um Customer-Objekte in der schließlich erzeugten Liste mailingCust hinzuzufügen oder aus dieser zu entfernen. Die Methode getMailingList() hängt nicht von der Größe ihres Eingabe-Arrays ab.