Talán sokunk nem tudja még (nem nézett utána vagy nem volt eddig szüksége rá), de a JDBC 4.0 sok újdonsága között az egyik lenagyobb újítás a BaseQuery interfész lesz, amelyet annotációkkal lehet majd kezelni. Az annotációk az ötös Java újításai között jelent meg, a BaseQuery interfész pedig (majd) a hatos Java és a JDBC 4.0 közös gyermeke lesz, erről olvashatunk cikket a Worx.com írásai között. A lekérdezéseinket egy BaseQuery interfészt kiterjesztő osztályba kell tennünk az alábbi módon:
public interface QueryAnnotationExample extends BaseQuery { @Select(sql="SELECT ID, MODEL, MODEL_YEAR FROM CAR WHERE MODEL_YEAR = ?1") public DataSet<Car> getCarsModelYear( String year ); }
Természetesen a megoldás épít a JPA már meglévő annotációira, tehát kell egy Car osztály, amely JPA compliant állapotban van.
QueryAnnotationExample qae = null; try { String url = "jdbc:derby://localhost:1527/wrox;create=true"; Connection con = DriverManager.getConnection(url , "APP", "password"); qae = con.createQueryObject(QueryAnnotationExample.class); } catch (SQLException e) { e.printStackTrace(); } Collection<Car> cars = qae.getCarsModelYear("1999");
Amint látjuk, az adatbázis kapcsolódás azonos módon történik, a lekérdezés folyamata azonban teljesen újszerű lesz. A lekérdezés során ugyanis létrehozunk egy annotációkkal megtűzdelt osztályunkból egy példányt, amelyből majd lekérdezünk, s a lekérdezés eredménye nem egy ResultSet lesz, hanem egy OOP szempontoknak teljes mértékben megfelelő JPA entitás kollekció. Ebből a kollekcióból simán le tudunk kérni egy listát, át tudjuk adni a klienseknek XML szerializációval, satöbbi:
for ( Car c : cars) { System.out.println(" car id=" + c.getId() + " model="+c.getModel() +" year="+ c.getYear() ); }
3 Comments
Auth Gábor AUTHOR
Ez nagggggggyon tetszik... várom már, mikor lehet használni... :)
Érdekes, hogy a JDK SE 6 API nem tartalmazza a java.sql.BaseQuery osztályt. :(
Karnok Dávid
Demég igen messze van a C# LINQ megvalósításától. Ott még a Car-t sem kell külön létrehozni:
Auth Gábor AUTHOR