190 likes | 327 Views
Kapitel 6. Anbindung an Anwendungen. Lernziele. . Das grundsätzlichen Problem bei der Kopplung von objektorientierten Programmiersprachen mit relationalen Datenbanken kennenzulernen Konzepte zur Anbindung von Datenbanken an Applikationen
E N D
Kapitel 6 Anbindung an Anwendungen
Lernziele • Das grundsätzlichen Problem bei der Kopplung von objektorientierten Programmiersprachen mit relationalen Datenbanken kennenzulernen • Konzepte zur Anbindung von Datenbanken an Applikationen • Selbst einfache Datenbankanbindungen programmieren zu können • Die grundlegende Funktionsweise von Persistenz Datenbanken, SS 2012 Kapitel 6: Anbindung an Anwendungen
Impedance Mismatch zwischen OO und RM • Ein Objekt wird definiert durch: • Identität • Zustand • Verhalten • Kapselung • Eine Relation enthält Aussagen mit dem Wahrheitswert TRUE. Beispielsweise: Es gibt einen PROFESSOR namens Sokrates, dieser hat den RANG C4 und arbeitet im RAUM 226. • Beides ist nicht trivial kompatibel. Warum? Datenbanken, SS 2012 Kapitel 6: Anbindung an Anwendungen
Impedance Mismatch zwischen OO und RM (2) • Struktur: • Dieses Problem haben wir bereits in Kapitel 3 kennengelernt, um von UML ins Relationenmodell zu kommen • RM hat keine Vererbung, kein Verhalten, keine 1-zu-n oder gar n-zu-n Beziehungen • Identität: • Tupel haben von sich aus keine eindeutige Identität. • Datenkapselung: • Objekte können selbst bestimmen wie sie verändert werden • Arbeitsweise: • Relationen arbeiten global transaktionsbasiert • Objekte sind untereinander vernetzt • Ergebnismenge: • SQL-Anfragen liefern (Multi-)Mengen, keine Objekte Datenbanken, SS 2012 Kapitel 6: Anbindung an Anwendungen
Die gute Nachricht • Alle diese Probleme sind im Einzelfall lösbar. • Die schlechte Nachricht • Entweder man muss Einschränkungen bei den Objekten hinnehmen, die persistent sein sollen, oder es wird sehr kompliziert und/oder unperformant. • (Oder man nimmt eine nicht-relationale Datenbank.) Datenbanken, SS 2012 Kapitel 6: Anbindung an Anwendungen
Die einfache Lösung: Datenbanktreiber http://www.jeckle.de/images/ebe/JDBCdrivers.gif Datenbanken, SS 2012 Kapitel 6: Anbindung an Anwendungen
Aus Programmierersicht Software zur Verbindung mit einem speziellen RDBMS (z.B. Oracle) Driver registriert sich Verwaltet die geladenen Treiber DriverManager erstellt Die Verbindung zur Datenbank Connection überträgt Ein SQL-Statement Statement liefert Das Ergebnis des Statements ResultSet Datenbanken, SS 2012 Kapitel 6: Anbindung an Anwendungen
Aus Programmierersicht Class.forName (Drivername); Connection con = DriverManager.getConnection( DBurl, user, password); Statement st = con.createStatement(); ResultSet results = st.executeQuery(query); st.close(); con.close(); Driver registriert sich DriverManager erstellt Connection überträgt Statement liefert ResultSet Datenbanken, SS 2012 Kapitel 6: Anbindung an Anwendungen
Auslesen von Resultaten String query = “SELECT PersNr, Name FROM Professoren WHERE Rang= 'C4';”; ResultSet results = st.executeQuery(query); while (results.next()) { int persNr = results.getInt(1); String name = results.getString(2); workWith(persNr,name); } Datenbanken, SS 2012 Kapitel 6: Anbindung an Anwendungen
Nachteile von Treibern • Kein Syntax-Check des SQL-Statements • Es kann nicht über Statement-Grenzen hinweg optimiert werden. (Tatsächlich gibt es die Möglichkeit per PreparedStatement ein Statement wiederzuverwenden, was sehr äußerst positiv auf die Performance auswirkt. ) • Es werden keine Objekte abgespeichert, sondern nur simple Types Datenbanken, SS 2012 Kapitel 6: Anbindung an Anwendungen
Spracheinbettung (z.B. SQLJ) • Beispiel: • #sql[ctx] { SELECT MAX(SALARY), AVG(SALARY) INTO :maxSalary, :avgSalaryFROM DSN8710.EMP }; • Spracheinbettungen und 4GL-Sprachen bieten eine bessere Integration, weil das SQL direkt im Quellcode steht • Ein Präprozessor übersetzt die eingebettete Befehle und fängt damit auch Syntax-Fehler ab • Weiterer Vorteil: Variablen können besser eingesetzt werden • Hauptnachteil: • Sehr geringe Unterstützung von anderen Produkten, da Spracheinbettungen als altmodisch gelten • Die Sprache selbst wird verändert, dies kann • zu Inkompatibilitäten mit anderen Präprozessoren führen • Debugging deutlich schwieriger machen • Fazit: Nicht mehr state-of-the-art Datenbanken, SS 2012 Kapitel 6: Anbindung an Anwendungen
Persistenzframeworks • Grundidee: Transparente Persistenz von Objekten durch Mapping zwischen Objekten und Relationen • Vorgehen: Der Zustand einfacher Java Objekte (POJOs) wird vom Framework in der Datenbank festgehalten • Vorteil: Der Programmierer kann mit den Objekten normal arbeiten • Weiterer Vorteil: Das Mapping ist nicht mehr implizit in der Geschäftslogik „versteckt“, sondern wird explizit angegeben • Netter Nebeneffekt: Die Aufteilung in Domänenklassen, die persistiert werden, und in andere Klassen entspricht dem MVC- Programmierparadigma Datenbanken, SS 2012 Kapitel 6: Anbindung an Anwendungen
Persistenzframeworks (Beispiel Hibernate) • Das Modell wird in Domänenklassenfestgehalten (EJBs) • Der Zugriff auf die EJBs erfolgt von Applikationsseite aus über DAOs (Data Access Objects) zur Entkopplung • Hibernate selbst greift auf die Domänenklassen per Reflection zu • Das Mapping zwischen Objekten und Datenbank wird durch XML-Dateienfestgelegt (oder Annotations) • Der Zugriff auf die Datenbank geschieht per JDBC • Die Konfiguration sowohl des Datenbankzugriffs als auch des Verhaltens von Hibernate wird zentral verwaltet http://www.hibernate.org/hib_docs/v3/reference/en/html/architecture.html Datenbanken, SS 2012 Kapitel 6: Anbindung an Anwendungen
Persistenzframeworks (Beispiel Hibernate; Domänenklasse) • Beispiel einer Domänenklasse: • // Markiert die Klasse als persistierbar • @Entity • // Der Default Tabellenname wäre PROFESSOR • @Table ( name = “Professoren“) • publicclassProfessor { • @Id @GeneratedValue • Long PersNr; // Jede Klasse sollte eine ID haben • String Name; • String Rang; • Long Raum; • // leerer publicKonstruktur ist notwendig für Entities • public Professoren(){}; • /* getter und setter … */ • } Datenbanken, SS 2012 Kapitel 6: Anbindung an Anwendungen
Persistenzframeworks (Beispiel Hibernate; DAO) • Beispiel eines DAOs: • Hinweis:getHibernateTemplate() kommt aus DAO • publicclassProfessorDAOHibernateextends DAO • implementsProfessorDAO{ • publicvoidsaveProfessor(Professor toSave){ • getHibernateTemplate().saveOrUpdate(toSave); • } • public Professor getProfessorByPersNr(intPersNr){ • return (Professor) getHibernateTemplate().get(Professor.class, PersNr); • } • publicvoiddeleteProfessor(Professor toDelete){ • getHibernateTemplate().delete(toDelete); • } • } Datenbanken, SS 2012 Kapitel 6: Anbindung an Anwendungen
Persistenzframeworks (Beispiel Hibernate; weiterführend) • Komplexe Anfragen können sowohl über die Hibernate eigene Anfragesprache HQL als auch SQL gemacht werden • Es werden mehrere Methoden angeboten 1-zu-n und n-zu-n Beziehungen in der Datenbank darzustellen • Sowohl andere Objekte als auch Collections werden als Attribute akzeptiert • Allerdings muss ein Mapping explizit angegeben werden • Es gibt viele Tools, die den Einstieg in Hibernate erleichtern und viele der benötigten Dateien automatisch generieren • Domänenklassen können aus der Datenbank erzeugt werden • Standard DAOs können generiert werden • Das Datenbankschema kann aus den Domänenklassen generiert werden • Etc. Datenbanken, SS 2012 Kapitel 6: Anbindung an Anwendungen
Nachteile Persistenzframeworks • Relativ großer Overhead für kleine Projekte • Kein direkter Zugriff auf die Datenbank • Alles muss in Objekten gespeichert werden • Weniger Quellcode in der Persistenzschicht (-> weniger Fehler) • Viele Konfigurationsoptionen um z.B. die Performanz zu optimieren • Hervorragende Umsetzung von loser Kopplung zwischen den Komponenten Modell und Persistenz Vorteile Persistenzframeworks Datenbanken, SS 2012 Kapitel 6: Anbindung an Anwendungen
Fazit • Es gibt verschiedene Möglichkeiten Anwendungen an eine relationale Datenbank anzubinden • Das Hauptproblem ist dabei der Impedance Mismatch zwischen objektorientierter und relationaler Welt • Der einfachste Weg ist es direkt per Treiber mit der Datenbank zu kommunizieren • Eine etwas bessere Integration bieten Spracheinbettungen • Persistenzframeworks erlauben es das Mapping zwischen den Objekten und der Datenbank festzulegen. So kann der Programmierer direkt mit den Objekten arbeiten. Datenbanken, SS 2012 Kapitel 6: Anbindung an Anwendungen