Data Access API Christoph Knabe Beuth-Hochschule Berlin FB VI 20.10.2009 Gliederung DAO Pattern Generic DAO DAO Factory Fazit DAO Pattern Data Access Object (DAO) pattern Aus Core J2EE Patterns http://java.sun.com/blueprints/corej2eepatterns/Patterns/ Kapselt alle Datenbankzugriffe für eine Domainklasse Vor Java5-Generizität höchst wichtig für Typsicherheit In serviceorientierter Architektur benutzt Datenzugriffstechnik austauschbar weggekapselt Operationen z.B. //Da = Data Access, Dm = Data Model public interface DaKunde { void save(DmKunde kunde); //insert or update void delete(DmKunde kunde); DmKunde find(long id) throws NotFoundExc; Collection<DmKunde> findAll(); Collection<DmKunde> findByUsername(String username); } ... Generic DAO Ab Java 5 sinnvoll Bietet alle schematischen Dienste vorimplementiert public interface DaGeneric<E> { //Must have constructor(Class<E> type) void save(E entity); //insert or update void delete(E entity); E find(long id) throws NotFoundExc; Collection<E> findAll(); Collection<E> findByField(String fieldName, Object fieldValue); Collection<E> findByWhere(String whereClause, Object... args); Collection<E> findByExample(E example); } Bsp. Implementierung: Erbt schematische, implementiert nur zusätzliche Operationen: class DaKundeImpl implements DaKunde extends DaGenericImpl<DmKunde> { ...super(DmKunde.class);... Collection<DmKunde> findByUsername(String username){ return super.findByField(DmKunde.USERNAME, username); } } DAO Factory, Benutzung Für Austauschbarkeit der DA-Technik Bsp. DAO Factory: interface DaFactory { DaBase getBaseDA(); DaKunde getKundeDA(); DaKonto getKontoDA(); } class JpaDaFactory implements DaFactory { ... public DaKunde getKundeDA(){ return new DaKundeImpl(...); } } Benutzung z.B.: final DaFactory daFactory = new JpaDaFactory(...); final DaKunde daKunde = daFactory.getKundeDA(); final DmKunde kunde = daKunde.find(7); kunde.setEmail(...); daKunde.save(); Fazit + Kapselung: Technik ist hinter Interfaces DaFactory und DaGeneric gekapselt und daher austauschbar + Wenig Code durch produktiven Einsatz von Generizität + typsicher: Logik-Code benutzt nur die typsicheren DAOs, z.B. DaKunde + lesbar: Logik-Code benutzt gut verständliche DAO-Operationen, z.B. daKunde.findByUsername("mueller"); P.S.: Dies ist eine Ideenskizze; wurde nicht identisch ausgetestet. Lit. z.B.: https://www.hibernate.org/328.html http://www.ibm.com/developerworks/java/library/j-genericdao.html