java-persistenz-architekturen - doag.org · jdbc-historie java data base connectivity zugriff auf...
TRANSCRIPT
© 2008, Rudolf Jansen
Java-Persistenz-Architekturen
Rudolf Jansen
Freiberuflicher Entwickler und Autor
http://[email protected]
DOAG – Konferenz 1.12.2008
© 2008, Rudolf Jansen
Inhalt
�JDBC�JPA (Java Persistence API)
�Spring�Alternative Architekturen( Java in der DB, Java Embedded Databases )
�Vergleich, Diskussion
© 2008, Rudolf Jansen
JDBC-Historie
� Java DataBase Connectivity� Zugriff auf DB über Java-API-Funktionen
ResultSet resSet = stmt.executeQuery("select prs_vorname, prs_nachname from person");
� Abbildung auf konkrete Datenbank durch JDBC-Treiber
� Portabilität (theoretisch)� Historie:
- JDBC 1.0 (1997, JDK 1.1)- JDBC 2.0 (JDK 1.2)- JDBC 3.0 (2002, JDK 1.4)- JDBC 4.0 (2006, Java SE 6)
© 2008, Rudolf Jansen
JDBC: Pro und Contra
�Manuelle JDBC-Programmierung: Wer macht das denn heute noch?
� „Vorteil“: Programmieren ganz nah an der Datenbank
� „Nachteil“: SQL-Statements direkt im Sourcecode- Wartbarkeit- Portabilität- viel Handarbeit nötig (Fehleranfällig)- …
© 2008, Rudolf Jansen
JDBC: Pro und Contra
�Vielzahl von „höherwertigen“ Techniken und Tools, die auf JDBC aufbauen:- Java Persistence API (JPA)- Spring- Hibernate- JDO- EJB- …
© 2008, Rudolf Jansen
JDBC-ExceptionHandling
Connection con = null;Statement stmt = null;try{con = getDataSource().getConnection();stmt = con.prepareStatement(„select …“);ResultSet resSet = stmt.executeQuery();...stmt.close();con.close();
} catch (SQLException ex) {…
}
© 2008, Rudolf Jansen
JDBC-ExceptionHandling
Connection con = null;Statement stmt = null;try{con = getDataSource().getConnection();stmt = con.prepareStatement(„select …“);ResultSet resSet = stmt.executeQuery();... Was passiert, wenn hier einstmt.close(); Fehler auftritt?con.close();
} catch (SQLException ex) {…
}
© 2008, Rudolf Jansen
JDBC-ExceptionHandling
Connection con = null;Statement stmt = null;try{con = getDataSource().getConnection();stmt = con.prepareStatement(„select …“);ResultSet resSet = stmt.executeQuery();... Was passiert, wenn hier ein stmt.close(); Fehler auftritt?con.close(); Ressourcen werden nicht
} catch (SQLException ex) { freigegeben!!!…
}
© 2008, Rudolf Jansen
JDBC-ExceptionHandling
Connection con = null;Statement stmt = null;try{con = getDataSource().getConnection();stmt = con.prepareStatement(„select …“);ResultSet resSet = stmt.executeQuery();...stmt.close();con.close();
} catch (SQLException ex) {…
} finally {if ( stmt != null ){try {stmt.close();
} catch (SQLException ex) { … }}… // analog con.close()}
© 2008, Rudolf Jansen
JDBC - Diskussion
�Weit verbreitet (Studium, Bücher, Schulungen, …)
�ABER: viel Handarbeit nötig- Wartungsaufwand- Sourcecode-Umfang und –Übersichtlichkeit
�Kritiker: „JDBC nur für Kleinprojekte“- Suche nach Alternativen (nicht nur für Enterprise-Anwendungen)
© 2008, Rudolf Jansen
Java EE / EJB-Persistenz
�EJB (Enterprise Java Beans)�Einführung 1998
- Beginn des Siegeszuges „Java auf dem Server“- Auszug aus der EJB 1.0 Spezifikation:“Enterprise JavaBeans will make it easy to
write applications. Application developers will not have to understand low-level transaction and state management details; multi-threading; resource pooling; and other complex low-level APIs”
© 2008, Rudolf Jansen
Java EE / EJB-Persistenz
Praxis-Erfahrungen mit EJB 1.0 und 2.0� Nimmt dem Entwickler viel Arbeit ab bei
- Transaktionssteuerung- Skalierbarkeit- Sicherheit
� Macht dem Entwickler aber viel Arbeit bei- Persistenzfragen
o Performanceo Keine Vererbung möglicho Komplexitäto Nur in EJB-Anwendungen einsetzbar (kein Java SE)
� Als reine Persistenzlösung sind EJBs (<Version 3.0) unnötig komplex
© 2008, Rudolf Jansen
Java-Persistenz
Stand in den Jahren 2004/2005
Java SEJava EE
JDBC
EigeneFrameworks
JDO
EJB 2.xHibernate
© 2008, Rudolf Jansen
Java-Persistenz
Stand in den Jahren 2004/2005
Java SEJava EE
JDBC
EigeneFrameworks
JDO
EJB 2.xHibernate
Konkurrenzkampf
© 2008, Rudolf Jansen
JavaJavaJavaJava----PersistenzPersistenzPersistenzPersistenz ab dem Jahr 2006ab dem Jahr 2006ab dem Jahr 2006ab dem Jahr 2006
Java SEJava EE
JDBC
EigeneFrameworks
JDO
EJB 3.0Hibernate
Java Persistence API (JPA)
© 2008, Rudolf Jansen
Java Persistence API
� Entstanden im Rahmen der EJB 3.0-Spezifikation
� Eigene Spezifikation (JSR 220)� „Ideengeber“:
- JDO- Hibernate- TopLink- Schlechte Erfahrungen mit EJB …
� JPA = Spezifikation- Implementierung u.a. durch Hibernate
� Persistenzlösung für Java EE und Java SE !!!� Einsatz von Java 5-Features (Annotations)
© 2008, Rudolf Jansen
Java Persistence API
� Ziel: Keine (bzw. minimale) Vorgaben für Persistenzaspekte- Verwendung von POJOs (Plain Old Java Objects)
�Vererbung
� Einsatz von Java 5-Features (Annotations)
�Keine Abhängigkeit von Containern, ApplicationServern etc.
� „Keep it simple“
© 2008, Rudolf Jansen
Java Persistence API
Zentrale Komponente von JPA: Entity
�„Normale“ Java-Klasse- Vererbung möglich
- Keine Vorgaben durch Basisklassen
- Keine Vorgaben durch Schnittstellen
�POJO
© 2008, Rudolf Jansen
Java Persistence API
@Entitypublic class Buch implements Serializable{@Idprivate int id;private String titel;
public Buch(){}
public int getId() { return id;}public void setId( int id ){ this.id=id }public String getTitel() { return titel;}public void setTitel( String titel ){ this.titel = titel;}
}
© 2008, Rudolf Jansen
Java Persistence API
- Id- titel
Buch
ID Titel4711 xyz4712 blabla
Tabelle BUCH
JPA
EntityManager
© 2008, Rudolf Jansen
Java Persistence API
- Id- titel
Buch
ID Titel4711 xyz4712 blabla
Tabelle BUCH
JPA
EntityManager
Bietet Methoden zum- Anlegen- Ändern- Löschen- Verwaltenvon POJOs (Instanzen von Buch)
© 2008, Rudolf Jansen
Java Persistence API
„Configuration by Exception“� Anzahl der zur Konfiguration benötigten Annotations soll minimiert
werden� Sinnvolle Defaults� Nur Ausnahmen explizit angeben
Beispiel:� Defaultregeln für Mapping Java-Klasse – Datenbanktabelle:
- Klassenname = Tabellenname- Attributname = Spaltenname
� Abweichungen von diesen Regeln müssen per Annotationangegeben werden
© 2008, Rudolf Jansen
Java Persistence API
- Id- titel
Buch
ID Name4711 xyz4712 blabla
Tabelle BIBLIOTHEK
JPA
EntityManager
© 2008, Rudolf Jansen
Java Persistence API
@Entity@Table(name=“BIBLIOTHEK“)public class Buch implements Serializable{@Idprivate int id;
@Column(name=“NAME“)private String titel;
public Buch(){}
public int getId() { return id;}public void setId( int id ){ this.id=id }public String getTitel() { return titel;}public void setTitel( String titel ){ this.titel = titel;}
}
© 2008, Rudolf Jansen
JPA - EntityManager
Konfiguration/Initialisierung des EntityManager:
EntityManagerFactoryemf=Persistence.createEntityManagerFactory(„OracleTestDB");
EntityManager em=emf.getEntityManager();EntityTransaction tx=em.getTransaction();tx.begin();
Buch neuesBuch = new Buch();neuesBuch.setId(4713);neuesBuch.setTitel(“Ein ganz neues Buch“);em.persist(neuesBuch);
tx.commit();em.close();
© 2008, Rudolf Jansen
JPA - EntityManager
Konfiguration/Initialisierung des EntityManager:
EntityManagerFactoryemf=Persistence.createEntityManagerFactory(„OracleTestDB");
EntityManager em=emf.getEntityManager();EntityTransaction tx=em.getTransaction();tx.begin();
Buch neuesBuch = new Buch();neuesBuch.setId(4713);neuesBuch.setTitel(“Ein ganz neues Buch“);em.persist(neuesBuch);
tx.commit();em.close();
Woher kennt JPA die „OracleTestDB“?
© 2008, Rudolf Jansen
JPA - Konfiguration
Datei persistence.xml:
<persistence><persistence-unit name=„OracleTestDB">
<provider>oracle.toplink.essentials.ejb.cmp3.EntityManagerFactoryProvider</provider><class>de.javastarterdays.buch</class><properties>
<!-- Provider-specific connection properties --><property name="toplink.jdbc.driver" value="oracle.jdbc.driver.OracleDriver"/><property name="toplink.jdbc.url"
value="jdbc:oracle:thin:scott/tiger@localhost:1521:XE"/></properties>
</persistence-unit></persistence>
© 2008, Rudolf Jansen
JPA – Einträge finden und ändern
EntityTransaction tx=em.getTransaction();tx.begin();
Buch altesBuch = em.find(Buch.class, 4711);if( altesBuch != null ){altesBuch.setTitel(“Ein geaenderter Titel“);
}
tx.commit();
© 2008, Rudolf Jansen
JPA – Abfragen
�Abfragen mit mehr als einem ErgebnisQuery query = em.createQuery(„SELECT b FROM Buch b“)
Collection buecher = query.getResultList();
�Abfragen mit genau einem ErgebnisQuery query = em.createQuery(„SELECT b FROM Buch b WHERE b.id=:nr“);
query.setParameter(“nr“, 4711); Buch dasGesuchteBuch = query.getSingleResult();
© 2008, Rudolf Jansen
JPA – Provider
Übersicht über die bekanntesten Provider:
� Top Link
� OpenJPA
� Hibernate
� …
© 2008, Rudolf Jansen
Spring
Ausgangspunkt EJB:� Häufig genannte Kritik an EJB:
- Komplexität- Zu viele Vorgaben, d.h. Klassen/Schnittstellen, die verpflichtend sind
- Abhängigkeit von J2EE Container- Tests aufwändig- Performance bei Persistenzfragen kritisch- Abgrenzung J2EE – J2SE�Suche nach Alternativen
© 2008, Rudolf Jansen
Spring - Historie
�Buch „Expert One-on-One J2EE Design and Development“ Rod Johnson (2002)�Begleitmaterial: Sourcecode für „Applikationsframework“
�Überführung in Open-Source-Projekt (2003)�Name: Spring
�Heute: Populäres Open-Source-Framework� Freie Nutzung� „Firma hinter Spring“: SpringSource
© 2008, Rudolf Jansen
Spring
- Spring ist ein Framework� Kein Produkt� Keine Spezifikation� Kein O/R-Mapping-Tool� Bietet nicht nur Lösungen für Persistenz-Schicht, sondern viel
mehr
- Spring bietet Services an, um das Zusammenspiel von (Java-)Komponenten zu vereinfachen� Einheitliche API-Schicht� Abhängigkeiten zwischen Komponenten verwalten� Aspekt-Orientierte Programmierung
- Session „Das SpringSource Advanced Pack for Oracle“13:00 Uhr
© 2008, Rudolf Jansen
Spring und Persistenz
� Spring liefert keine eigene Persistenzlösung� Stattdessen: Vereinfachung bei der Nutzung
bestehender Persistenztechniken durch zusätzliche Abstraktionsschicht
� Spring kann zusammen mit allen bekannten Persistenztechniken eingesetzt werden:- JDBC- JDO- JPA- Hibernate- …
© 2008, Rudolf Jansen
Spring und Persistenz
�Spring vereinheitlicht Transaktionssteuerung, Exceptions, Verbindungshandling�Hybride Ansätze möglich
�Entwickler implementiert nur die Businesslogik (Persistenz: Abfragen und Behandlung der Ergebnisse)�Spring kümmert sich um den Rest
�Beispiel: JDBC Verbindungs- und Exceptionhandling
© 2008, Rudolf Jansen
JDBC
Connection con = null;Statement stmt = null;try{con = getDataSource().getConnection();stmt = con.prepareStatement(„select * from emp“);ResultSet resSet = stmt.executeQuery();...stmt.close();con.close();
} catch (SQLException ex) {…
} finally {if ( stmt != null ){try {stmt.close();
} catch (SQLException ex) { … }}… // analog con.close()}
© 2008, Rudolf Jansen
JDBC
Connection con = null;Statement stmt = null;try{con = getDataSource().getConnection();stmt = con.prepareStatement(„select * from emp“);ResultSet resSet = stmt.executeQuery();...stmt.close();con.close();
} catch (SQLException ex) {…
} finally {if ( stmt != null ){try {stmt.close();
} catch (SQLException ex) { … }}… // analog con.close()}
Anwendungscode ist nur das!
Rest ist- Verbindungshandling- Exception Handlingund wird bei jedem JDBC-Zugriff benötigt� ca. 80% des JDBC-Sourcecodes wiederholt sich
© 2008, Rudolf Jansen
Spring
� Dasselbe mit Spring:public List getEmpList() {return getJdbcTemplate().queryForList(“select * from usertable”);}
� JdbcTemplate kümmert sich um den Rest� DB-Zugriffsparameter in externer Konfigurationsdatei� Eigene Spring-Exception-Hierarchie� Exceptions unabhängig von verwendeter Technologie (JDBC-
Exceptions ansonsten unterschiedlich zu Hibernate-EXceptions)� …
© 2008, Rudolf Jansen
Inhalt
�JDBC�JPA (Java Persistence API)�Spring�Alternative Architekturen(Java in der DB, Java Embedded DB )
�Vergleich, Diskussion
© 2008, Rudolf Jansen
Alternative Architekturen
� Bisher immer „Standard-Architektur“:
� Alternativen:� Java in der Datenbank
�Datenbank in der Java-Anwendung
DatenbankJava-Anwendung
Direktzugriff, z.B. JDBC
EJB, OR-Mapper,
…
© 2008, Rudolf Jansen
Java in der Datenbank
Java-Source-Code(*.java)
Java-Class-Dateien(*.class)
JAR-Archive (*.jar)
loadjava
Oracle-DB
Java-Compiler
Java-Sourcen
Java-Klassen
Java-Ressourcen
© 2008, Rudolf Jansen
Alternative Architekturen
�Bisher immer „Standard-Architektur“:
�Alternativen:� Java in der Datenbank
�Datenbank in der Java-Anwendung
DatenbankJava-Anwendung
Direktzugriff, z.B. JDBC
EJB, OR-Mapper,
…
© 2008, Rudolf Jansen
Java Embedded Datenbanken
�Einsatzgebiete:- Speicherung von Konfigurationsdaten
- Ablage temporärer Nutzerdaten
- ... (andere „Mini-Persistenz-Anforderungen“)
�Standardalternativen:- Speicherung in Betriebssystem-Datei
- Speicherung in „richtiger“ Datenbank
© 2008, Rudolf Jansen
Java Embedded Datenbanken
Standardalternativen:� Speicherung in Betriebssystem-Datei:
+ Schnell implementiert- Sicherheit, Transaktionen, Backup , …
� Speicherung in „richtiger“ Datenbank:+ Sicherheit, Transaktionen, Backup , …- Kosten, Administration beim Endbenutzer erforderlich, …
�Kompromisslösung: Embedded Datenbank
© 2008, Rudolf Jansen
Inhalt
�JDBC�JPA (Java Persistence API)�Spring�Alternative Architekturen(Java in der DB, Java Embedded DB )
�Vergleich, Diskussion
© 2008, Rudolf Jansen
Auswahl der richtigen Persistenzstrategie
Entscheidungskriterien�Art der Java-Anwendung (J2SE, J2EE, J2ME)�Meist: Persistenz nicht einzige Fragestellung�Größe des Projektes� Erfahrung mit Frameworks� (Unterstützung der eingesetzten Datenbank)� In bestehenden Projekten meist keine Wahl mehr
© 2008, Rudolf Jansen
Auswahl der richtigen Persistenzstrategie
Einige Lösungsansätze:� Kleine Projekte mit „einfachen“ DB-Zugriffen
� JDBC
� Neue Enterprise-Anwendungen� JPA�Hibernate
� Spring als Empfehlung für umfassendes Framework (nicht nur für Persistenz)
� Eigenentwicklung von Frameworks eher meiden