java-persistenz-architekturen - doag.org · jdbc-historie java data base connectivity zugriff auf...

48
© 2008, Rudolf Jansen Java-Persistenz-Architekturen Rudolf Jansen Freiberuflicher Entwickler und Autor http://www.rudolf-jansen.de [email protected] DOAG – Konferenz 1.12.2008

Upload: others

Post on 16-Oct-2019

20 views

Category:

Documents


0 download

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

Java Embedded Datenbanken

JVM

Java-Embedded-Datenbank

JDBC

Java-Anwendung

© 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