Preview only show first 10 pages with watermark. For full document please download

Anbindung An Relationale Datenbanken

   EMBED


Share

Transcript

Softwaretechnik Anbindung an relationale Datenbanken Prof. Dr. Matthias H¨ olzl Joschka Rinke 13. Januar 2016 Anbindung an eine Datenbank Ziel Speicherung von persistenten Objekten, d.h. von Objekten des Anwendungskerns, die dauerhaft ben¨ otigt werden (z.B. Kunden, Konten, Fl¨ uge, B¨ ucher, . . . ). M¨ oglichkeiten I Relationale Datenbanken: Unterst¨ utzen Assoziationen und Vererbung nicht. Deshalb wird eine explizite Schnittstelle zwischen dem Anwendungskern und dem relationalen Datenbanksystem ben¨ otigt. I Objektrelationale Datenbanken: Erweitern relationale Datenbanken um objektorientierte Konzepte, meist Vererbung. I NoSQL-Datenbanken Sammelbegriff f¨ ur Datenbanken, die nicht dem relationalen Modell folgen Varianten von NoSQL-Datenbanken I I I I I Objektorientierte Datenbanken: Unterst¨ utzen Assoziationen, Vererbung und Operationen. ODMG-Standard: ODL (object definition language) f¨ ur Schemadeklarationen, OQL (object query language) und Sprachanbindungen Dokumentenorientierte Datenbanken: Enthalten nicht Tabellen mit vorgegebenem Schema sondern Dokumente, z.B. im XML oder JSON Format (CouchDB, MongoDB) Graphdatenbanken: Speichern Graphen, entweder als Knoten und Kanten, die beide durch Attribute annotiert werden k¨onnen, oder als Tripel/Quadrupel (RDF, Abfragesprache SPARQL) Key-Value Datenbanken: Verwenden ein einfaches assoziatives Array als zugrundeliegendes Datenmodell (Berkeley DB, Apache Dynamo) Spaltenorientierte Datenbanken: Speichert Tabellen Spaltenweise, nicht zeilenweise (Cassandra, HBase) Anbindung an Relationale Datenbanken Abbildung eines Objektmodells auf Tabellen Voraussetzung F¨ ur jede Entity-Klasse A ist ein Prim¨arschl¨ usselattribut aKey eingef¨ uhrt. Abbildung von Klassen Tabelle A <> A aKey a1 ... an ... aKey a1 ... an Abbildung von Assoziationen Multiplizit¨ at * - * Verwendung einer eigenen Tabelle mit den Prim¨arschl¨ usseln von A und B. A aKey ... * * B bKey ... aKey bKey Abbildung von Assoziationen Multiplizit¨ at * - 0..1 Prim¨arschl¨ ussel von B als Fremdschl¨ ussel in die Tabelle von A aufnehmen. A aKey ... * 0..1 B bKey ... aKey a1 Abbildung von Assoziationen at 0..1 - 0..1 Multiplizit¨ Prim¨arschl¨ ussel von B in die Tabelle von A oder Prim¨arschl¨ ussel von A in die Tabelle von B aufnehmen. 0..1 A 0..1 aKey ... B aKey a1 ... an bKey bm aKey bKey ... oder bKey b1 ... Bemerkung A 0..1 1 B Bei ist der Prim¨arschl¨ ussel von B als Fremdschl¨ ussel zur Tabelle von A hinzuzunehmen. Abbildung von Vererbung A key a B b C c Abbildung von Vererbung Variante I: Je eine Tabelle pro Klasse Tabelle A key a Tabelle B key b Tabelle C key c Nachteil: Bei Anfragen und Manipulationen, die Objekte einer Unterklasse betreffen, m¨ ussen ggf. Eintr¨age in mehreren Tabellen ber¨ ucksichtigt werden (z.B. bei Auswahl aller Attributwerte aller B-Objekte). Abbildung von Vererbung Variante II: Tabellen von Unterklassen enthalten geerbte Attribute Tabelle A key a Tabelle B key a Tabelle C b key a c Falls A abstrakt ist, gen¨ ugt eine Tabelle pro Unterklasse (Tabelle A entf¨allt). Nachteil: ¨ Bei Anderungen an der Form der Oberklasse, m¨ ussen auch die Tabellen der Unterklassen ver¨andert werden. Abbildung von Vererbung Variante III: Eine Tabelle f¨ ur alle Ober- und Unterklassen Tabelle ABC key a b c Typ Nachteil: In Spalten, die f¨ ur Objekte einer Unterklasse nicht relevant sind, m¨ ussen Nullwerte eingetragen werden. Datenbankanbindung mit JDBC I JDBC (Java Database Connectivity) bietet eine SQL-Schnittstelle f¨ ur Java-Programme I JDBC ist unabh¨angig von einem konkreten (relationalen) Datenbanksystem. Zum Zugriff auf ein konkretes Datenbanksystem muss ein entsprechender Treiber geladen werden Schichten einer JDBC-Anwendung Java−Anwendungskern <> JDBC−Datenbankschnittstelle java.sql::DriverManager JDBC−Treiber JDBC−Treiber DBMS DBMS java.sql JDBC-Kurz¨uberblick <> Connection DriverManager +getConnection(url: String): Connection +registerDriver(d: Driver) +getDriver(url: String): Driver <> Statement +createStatement(): Statement +executeQuery(sql: String): ResultSet +close() ... +executeUpdate(sql: String): Integer ... +getResultSet(): ResultSet ... * <> Driver +connect(url: String, info:Properties): Connection ... Liefert Daten der Spalte i der aktuellen Zeile als String−Objekt <> ResultSet +getString(i: Integer): String +getInt(i: Integer): Integer Geht zum ersten bzw. zum nächsten Datensatz ... +next(): Boolean JDBC-Kurz¨uberblick I Driver“, Connection“, Statement“ und ResultSet“ sind ” ” ” ” Schnittstellen, die von den Klassen eines geladenen Treiberpakets implementiert werden I Der DriverManager registriert Treiber f¨ ur bestimmte DB-Systeme. Der Aufruf der statischen Operation getConnection“ stellt (mittels eines f¨ ur die gegebene URL ” passenden Treibers) eine Verbindung zu einem DB-System her I Mittels eines Connection-Objekts kann ein Statement-Objekt erzeugt werden (Operation createStatement“) ” ←- JDBC-Kurz¨uberblick I I I I Mittels eines Statement-Objekts kann z.B. eine Anfrage an die DB gestellt werden (Operation executeQuery“) ” Die Ergebnistabelle der Anfrage wird in einem ResultSet-Objekt gespeichert Die Tabelle eines ResultSet-Objekts kann mit der Operation next“ zeilenweise durchlaufen werden ” Auf die Felder innerhalb einer Zeile kann mit einer (bzgl. des Spaltentyps) passenden get-Operation zugegriffen werden Beispiel: try { // Treiber auch von außen setzbar Class.forName("imaginary.sql.iMsqlDriver"); String url = "jdbc:msql://localhost/myDB"; Connection con = DriverManager.getConnection(url); Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM test"); while (rs.next()) { // Zugriff auf die Spalte mit der Nummer y und dem Typ XXX // in der aktuellen Zeile XXX v = rs.getXXX(y); } con.close(); } catch (Exception e) { e.printStackTrace(); } Materialisierung von Objekten Gegeben Klassen im Anwendungskern: A B −aKey: String −bKey: String −a1: Typ1 ... −b1: Typ1 ... −an: Typn −bm: Typm +setAKey(x: String) +setBKey(x: String) +setA1(x: Typ1) ... +setB1(x: Typ1) ... ←- Materialisierung von Objekten Gegeben Tabellen in der relationalen Datenbank: Tabelle A aKey a1 ... Tabelle B an bKey b1 ... bm Materialisierung mit JDBC 1 RDBBroker {abstract } stmt = con.createStatement(); rs = stmt.executeQuery( "SELECT * FROM " + tabname() + " WHERE " + keyname() + " = " + "’" + key + "’"); if (rs.next()) return recordAsObject(); else return null; con = c; return "A"; #con + materialize(key: String): Object # recordAsObject(): Object {abstract} 0..1 −stmt # tabname(): String {abstract} 0..1 # keyname(): String {abstract} # rs ARDBBroker BRDBBroker + ARDBBroker(c: Connection) + BRDBBroker(c: Connection) # recordAsObject(): Object # recordAsObject(): Object # tabname(): String # tabname(): String # keyname(): String # keyname(): String return "aKey"; A a = new A(); a.setKey(rs.getString(0)); a.setA1(rs.getTyp1(1)); ... a.setAn(rs.getTypn(n)); return a; <> Connection <> Statement <> ResultSet Materialisierung mit JDBC try { String url = "jdbc:RDB-Typ//Rechner:Port/Datenbank"; Connection con = DriverManager.getConnection(url); ARDBBroker ardb = new ARDBBroker(con); BRDBBroker brdb = new BRDBBroker(con); A a = (A)ardb.materialize("xyz"); B b = (B)brdb.materialize("uvw"); } catch (Exception e) { e.printStackTrace(); } Materialisierung mit JDBC Bemerkungen I Zur Verbesserung der Effizienz werden h¨aufig Zwischenspeicher (Cache) verwendet. I Bei der Materialisierung von Objektstrukturen werden h¨aufig nur die gerade ben¨ otigten Objekte geladen (on-demand materialization). I Persistenz-Frameworks enthalten noch weitere Mechanismen z.B. zur Dematerialisierung und zur Transaktionskontrolle. Zusammenfassung I Zur Speicherung persistenter Objekte muss der Anwendungskern an eine Datenbank angeschlossen werden. I Dazu k¨onnen relationale, objektrelationale oder NoSQL Datenbanken verwendet werden. I Bei der Verwendung einer relationalen Datenbank muss zun¨achst das Objektmodell auf Tabellen abgebildet werden. (Insbesondere m¨ ussen Vererbungshierarchien geeignet abgebildet werden!) I JDBC bietet eine plattformunabh¨angige Schnittstelle zur Anbindung von Java-Programmen an relationale Datenbanken. I F¨ ur das Object-Relational-Mapping“ (ORM) verwendet man ” meist Persistenz-Frameworks.