Data Access API - Beuth Hochschule für Technik Berlin

Werbung
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
Herunterladen