Java und Datenbanken Ein Überblick Benjamin Lietzau & Philipp Meyer Sommersemester 2011 1
Themenüberblick 29.03.11 - Benjamin Lietzau & Philipp Meyer - Java und Datenbanken 2
Themenüberblick 1. Einführung 1. ODMG 2. Relationale Datenbanken 2. Java-basierte Datenbanken 1. Apache Derby 2. HSQLDB 3. JDBC-API 4. SQLJ 5. OR-Mapping 29.03.11 - Benjamin Lietzau & Philipp Meyer Java und Datenbanken 3
Einführung 29.03.11 - Benjamin Lietzau & Philipp Meyer - Java und Datenbanken 4
ODMG Object Database Management Group Herstellerverbund Normen und Standards Objektorientierter Datenbanksysteme OMG (Object Management Group) übernahm nach Release 3 Release 4 in Arbeit Modellierungswerkzeuge Object Definition Language (ODL) ODL kann problemlos in C++, Java, SmallTalk übersetzt werden 29.03.11 - Benjamin Lietzau & Philipp Meyer Java und Datenbanken 5
Relationale Datenbanken Bis heute der meist genutzte Standard SQL ist gängige Abfrage-/Manipulierungssprache Zeilen (Tupel) Spalten (Attribut) Datenbankschema beschreibt die Tabellenstruktur 29.03.11 - Benjamin Lietzau & Philipp Meyer Java und Datenbanken 6
Das Problem Anwendungsprogramm Javaprogramm SQL DB Database 29.03.11 - Benjamin Lietzau & Philipp Meyer Java und Datenbanken 7
Java-basierte Datenbanken 29.03.11 - Benjamin Lietzau & Philipp Meyer - Java und Datenbanken 8
Apache Derby Apache DB Subprojekt Basierend auf Java Nutzt JDBC Sehr klein und handlich /leichtgewichtig Embedded/Mobile Systems Kann direkt in Applikationen eingebettet werden (Embedded Database) 29.03.11 - Benjamin Lietzau & Philipp Meyer Java und Datenbanken 9
HSQLDB Lightweight 100% Java SQL Database Engine Datenbank-System nur 700kb Groß Integrierbarkeit Kann als Server/Client Variante benutzt werden Kann lokal in Programm integriert werden Flexibilität durch drei Tabellentypen Memory only Logdatei-Tabelle Gecachte-Tabelle Geschwindigkeit analog zu MySQL 29.03.11 - Benjamin Lietzau & Philipp Meyer Java und Datenbanken 10
Java Database Connectivity (JDBC) 29.03.11 - Benjamin Lietzau & Philipp Meyer - Java und Datenbanken 11
Was ist JDBC? Programmierschnittstelle (API) Zugriff auf Datenquellen Überwiegend für Datenbanksysteme genutzt Quellcode unabhängig von Datenquelle 29.03.11 - Benjamin Lietzau & Philipp Meyer Java und Datenbanken 12
Architektur Java Anwendung JDBC API JDBC Treibermanagement Treiber API MySQL Treiber Oracle Database Treiber Weitere Treiber 29.03.11 - Benjamin Lietzau & Philipp Meyer Java und Datenbanken 13
Treiber - Typen Typ 1: JDBC-ODBC-Brücke Typ 2: Plattformabhängige Programmbibliothek Typ 3: Zugriff über eine Middleware Typ 4: Direkter Zugriff auf die Datenbank 29.03.11 - Benjamin Lietzau & Philipp Meyer Java und Datenbanken 14
Architektur - Treibertypen JDBC Treibermanagement JDBC-ODBC Brückentreiber Plattformunabhängiger Treiber ODBC-API ODBC Treibermanagment Plattformabhängiger Treiber Middleware Plattformunabhängiger Treiber ODBC-Treiber Datenbank Typ 1 Typ 2 Typ 3 Typ 4 29.03.11 - Benjamin Lietzau & Philipp Meyer Java und Datenbanken 15
Verbindungsaufbau Variante 1 Treiberklasse laden (seit Java 6 nicht mehr notwendig) Class.forName(StringName) Datenquelle definieren Syntax: <jdbc> ::= jdbc:<treiber>:<optionen> <Treiber> ::= Vordefinierter Treiberkürzel <Optionen> ::= evtl. Optionen die der Treiber bietet URL also abhängig von der Datenquelle und evtl. Optionen Beispiel: jdbc:derby:c:/data/mydb;create=true connection = DriverManager.getConnection('jdbc:derby:c:/data/mydb;create=true'); 29.03.11 - Benjamin Lietzau & Philipp Meyer Java und Datenbanken 16
Verbindungsaufbau Variante 2 Problem: Client-Seitige Festlegung der Verbindungsdaten Lösung: Verbindungsdaten zentral verwalten Mittel: JNDI Aus Zeitgründen gehen wir nicht tiefer drauf ein 29.03.11 - Benjamin Lietzau & Philipp Meyer Java und Datenbanken 17
Daten abfragen Syntax einer SQL-Abfrage: SELECT <Spalten> FROM <Tabelle> WHERE <Bedingung> GROUP BY <Attribut> HAVING <Bedingung> ORDER BY <Sortierung>; Statement erstellen und SQL-Abfrage ausführen stat = connection.createstatement(); rs = stat.executequery('select * FROM Mitarbeiter;'); 29.03.11 - Benjamin Lietzau & Philipp Meyer Java und Datenbanken 18
Mit Datensätze arbeiten Alle Datensätze ausgeben while (rs.next()) { System.out.println(rs.getString(1)); } 29.03.11 - Benjamin Lietzau & Philipp Meyer Java und Datenbanken 19
Mit Datensätze arbeiten Alle Spalten aller Datensätze ausgeben while (rs.next()) { for(int i = 1; i <= stat.getmetadata().getcolumncount(); i++) { System.out.print(rs.getString(i)+, ); } Systme.out.print( \n ); } 29.03.11 - Benjamin Lietzau & Philipp Meyer Java und Datenbanken 20
Mit Datensätze arbeiten Cursor im ResultSet bewegen rs.next(); //nächster Datensatz rs.previus(); //vorheriger Datensatz rs.absolut(x); //gehe zum Datensatz x (int) rs.relative(x); //bewegt sich um x Datensätze vor (int) rs.afterlast(); //hinter letzten Datensatz rs.beforefirst(); //vor ersten Datensatz rs.first(); //zeigen auf erster Datensatz rs.last(); //zeige auf letzten Datensatz 29.03.11 - Benjamin Lietzau & Philipp Meyer Java und Datenbanken 21
Mit Datensätze arbeiten Positionsabfrage rs.isafterlast(); rs.isbeforefirst(); rs.isfirst(); rs.islast(); 29.03.11 - Benjamin Lietzau & Philipp Meyer Java und Datenbanken 22
Problematiken Wert ist NULL String text = rs.getstring(3); if(rs.wasnull()) { System.out.println('Feld enthält NULL'); } Anzahl der Ergebnisse rs.last(); int rownumber = rs.getrow(); rs.beforefirst(); 29.03.11 - Benjamin Lietzau & Philipp Meyer Java und Datenbanken 23
Problematiken - SQL-Injection Manipulation der SQL-Anweisung durch Dritte Gefahrenquelle: Parameter / Formulare Beispiel: Tabelle mit den Feldern: Name, Nachname, Wohnort Ziel der Abfrage: Wie viele Menschen wohnen in Ort x? SQL-Anweisung: 'SELECT count(*) FROM Benutzerdaten WHERE ort =' + x Angreifer übergibt für x 'Lemgo UNION SELECT Nachname FROM Benutzerdaten;' 29.03.11 - Benjamin Lietzau & Philipp Meyer Java und Datenbanken 24
Problematiken - SQL-Injection Komplette Abfrage: 'SELECT count(*) FROM Benutzerdaten WHERE ort = Lemgo UNION SELECT Nachname FROM Benutzerdaten;' Zusätzlich zu dem Ergebnis von count bekommt der Angreifer sämtliche Nachnamen aus der Tabelle Benutzerdaten, welche für ihn nicht vorgesehen waren 29.03.11 - Benjamin Lietzau & Philipp Meyer Java und Datenbanken 25
Problematiken - SQL-Injection Lösung: PreparedStatement Anstatt: Statement st = con.createstatement(); String abfrage = 'SELECT count(*) FROM Benutzerdaten WHERE ort = '; ResultSet rs = st.executequery(abfrage + eingabe + "';"); Verwendet man: String abfrage = 'SELECT count(*) FROM Benutzerdaten WHERE ort =?'; PreparedStatement pst = con.preparestatement(abfrage); pst.setstring(1, eingabe); ResultSet rset = pst.executequery(); 29.03.11 - Benjamin Lietzau & Philipp Meyer Java und Datenbanken 26
Datensätze anlegen/aktualisieren Syntax zum einfügen eines Datensatzes INSERT INTO <Tabelle> (<Spalte 1>, <Spalte 2>,, <Spalte n>) VALUES (<Wert 1>, <Wert 2>,, <Wert n>); Syntax zum aktualisieren eines Datensatzes UPDATE <Tabelle> SET <Spalte> = <Wert> WHERE <Bedingung>; Statement erstellen und SQL-Befehl ausführen stat = connection.createstatement(); count = stat.executeupdate('insert INTO Mitarbeiter VALUES(Heinz, Meier)'); 29.03.11 - Benjamin Lietzau & Philipp Meyer Java und Datenbanken 27
Datensätze anlegen/aktualisieren executeupdate() liefert Anzahl an bearbeiteten Datensätzen zurück Zeitaufwändig Mehrere Befehle ausführen: try { Statement stat = con.createstatement(); stat.addbatch( "INSERT INTO Mitarbeiter VALUES(Heinz, Meier)" ); stat.addbatch( "UPDATE Mitarbeiter SET name=jürgen WHERE id=15" ); stat.addbatch( "INSERT INTO Mitarbeiter VALUES(Micha, Jörens)" ); uc = s.executebatch(); } catch ( BatchUpdateException e ) { //Fehlerbehandlung } 29.03.11 - Benjamin Lietzau & Philipp Meyer Java und Datenbanken 28
Datensätze anlegen/aktualisieren Daten können auch direkt im ResultSet angepasst werden rs.updatestring("name", e.getname()); rs.updatestring("vorname", e.getvorname()); rs.updatestring("beschreibung", e.getbeschreibung()); rs.updaterow(); 29.03.11 - Benjamin Lietzau & Philipp Meyer Java und Datenbanken 29
SQLJ 29.03.11 - Benjamin Lietzau & Philipp Meyer - Java und Datenbanken 30
SQLJ Entwicklung von IBM, Oracle, Sybase und Informing SQL92-Standard (Embedded SQL) Auf Quelltextebene: Keine proprietären Eigenschaften des jeweiligen SQL-Dialektes Dann kompatibel mit DB-Format ggf. Probleme bei DB-Migration etc. 29.03.11 - Benjamin Lietzau & Philipp Meyer Java und Datenbanken 31
SQLJ Vorteile Direkter Zugriff auf Java-Variablen Bei Nutzung von DB2 bessere Authentifizierung möglich Klassische SQL-Statements möglich SQLJ-Translator erkennt Fehler beim Kompilieren Korrekte Syntax Typenkompatibilität zwischen SQL und Java Datenbankschema JDBC erst während der Laufzeit Nachteile Viele IDE unterstützen kein SQLJ Präprozessor nötig (SQL in Java-Code umwandeln) 29.03.11 - Benjamin Lietzau & Philipp Meyer Java und Datenbanken 32
SQLJ-Prinzip Profilmanager beinhaltete SQL-Befehle Customizer passt Profile an DBMS-Spezifika an Java-Quelltext mit SQLJ Java- Quelltext SQLJ- Profil Java Compiler SQLJ-Translator Syntaxprüfung Bytecode SQLJ- Laufzeitsystem JDBC Database 29.03.11 - Benjamin Lietzau & Philipp Meyer Java und Datenbanken 33
SQLJ Laufzeitsystem liegt in sqlj.runtime.* Statements beginnen mit #sql Variablen vom Quellcode möglich (:x) Ausdrücke aus dem Quellcode möglich (:x + y) IN oder OUT oder INOUT für Datenübergabe #sql [[<context>]] { <SQL-Anweisung> } 29.03.11 - Benjamin Lietzau & Philipp Meyer Java und Datenbanken 34
SQLJ - Beispiel SQLJ-Anweisung - INSERT. #sql [ctx] { }; INSERT INTO DSN8710.EMP (EMPNO, FIRSTNME, MIDINIT, LASTNAME, HIREDATE, SALARY) VALUES (:empno, :firstname, :midinit, :lastname, CURRENT DATE, :salary) 29.03.11 - Benjamin Lietzau & Philipp Meyer Java und Datenbanken 35
SQLJ - Beispiel JDBC zum Vergleich. PreparedStatement stmt = conn.preparestatement( "INSERT INTO DSN8710.EMP " + "(EMPNO, FIRSTNME, MIDINIT, LASTNAME, HIREDATE, SALARY) " + "VALUES (?,?,?,?, CURRENT DATE,?)"); stmt.setstring(1, empno); stmt.setstring(2, firstname); stmt.setstring(3, midinit); stmt.setstring(4, lastname); stmt.setbigdecimal(5, salary); stmt.executeupdate(); stmt.close(); 29.03.11 - Benjamin Lietzau & Philipp Meyer Java und Datenbanken 36
OR-Mapping 29.03.11 - Benjamin Lietzau & Philipp Meyer - Java und Datenbanken 37
OR-Mapping Ablegen von Objekten in einer relationalen Datenbank Programm sieht nur noch objektorientierte Datenbank Schlechtere Datenbankleistung Zusätzliche Zwischenschicht (Klassenbibliotheken) nötig Bsp. Hibernate oder Java Persistence API Einfachste Vorgehensweise: Klassen entsprechen Tabellen Jedes Objekt ist eine Zeile Identität des Objektes ist der Primärschlüssel Referenzen zu anderen Objekten über Primär-/Fremdschlüsselbeziehungen 29.03.11 - Benjamin Lietzau & Philipp Meyer Java und Datenbanken 38
OR-Mapping Beispiel Kunde 1 1 Adresse Name: String Strasse: String Ort: String PLZ: String Java public class Kunde{ public String name; public Adresse adresse; } public class Adresse{ public String strasse; public String ort; public String plz; } SQL create table Kunde( KundeID integer primary key, Name varchar(20), Strasse varchar(20), Ort varchar(20), PLZ varchar(20) ) 29.03.11 - Benjamin Lietzau & Philipp Meyer Java und Datenbanken 39
OR-Mapping Anwendungsprogramm Objektmodell Zwischenschicht (z.b. Hibernate) Abbildung Relationales Datenbankschema Database 29.03.11 - Benjamin Lietzau & Philipp Meyer Java und Datenbanken 40
OR-Mapping Vererbung abbilden ebenso möglich 3 Möglichkeiten Tabelle pro Vererbungshierarchie Attribute Superklasse & abgeleiteter Klassen in einer Tabelle Diskriminator (legt fest was welcher Klasse gehört) Tabelle pro Unterklasse Für jede abgeleitete Klassen wird eine weitere Tabelle angelegt Tabelle pro konkrete Klasse Attribute der Superklasse werden in die Tabelle der abgeleiteten Klasse abgelegt Keine Tabelle für die Superklasse 29.03.11 - Benjamin Lietzau & Philipp Meyer Java und Datenbanken 41
OR-Mapping Beispiel - Tabelle pro Vererbungshierarchie Kreis Radius: Integer Geometrische Form Flächeninhalt: Integer Polygon AnzahlEcken: Integer create table GeometrischeForm( ID integer primary key, Flächeninhalt integer, Radius integer, AnzahlEcken integer, Kantenlänge integer, FormTyp varchar(20)) Quadrat Kantenlänge: Integer Diskriminator 29.03.11 - Benjamin Lietzau & Philipp Meyer Java und Datenbanken 42
OR-Mapping Beispiel - Tabelle pro Unterklasse Kreis Radius: Integer Geometrische Form Flächeninhalt: Integer Polygon AnzahlEcken: Integer Quadrat Kantenlänge: Integer create table Kreis( KreisID integer primary key, Flächeninhalt integer, Radius integer ) create table Quadrat( QuadratID integer primary key, Flächeninhalt integer, AnzahlEcken integer, Kantenlänge integer) 29.03.11 - Benjamin Lietzau & Philipp Meyer Java und Datenbanken 43
OR-Mapping Beispiel - Tabelle pro konkrete Klasse create table GeometrischeForm( FormID integer primary key, Flächeninhalt integer) Kreis Radius: Integer Geometrische Form Flächeninhalt: Integer Polygon AnzahlEcken: Integer Quadrat Kantenlänge: Integer create table Kreis( FormID integer primary key, Radius integer, foreign key(formid) references GeometrischeForm(FormID)) create table Polygon( FormID integer primary key, AnzahlEcken integer, foreign key(formid) references GeometrischeForm(FormID)) create table Quadrat( FormID integer primary key, Kantenlänge integer, foreign key(formid) references Polygon(FormID)) 29.03.11 - Benjamin Lietzau & Philipp Meyer Java und Datenbanken 44
Quellen 29.03.11 - Benjamin Lietzau & Philipp Meyer - Java und Datenbanken 45
Quellenangaben 1. Java und Datenbanken, Wolfgang Dehnhardt, 1. Auflage 2003, Hanser Verlag 2. Datenbanken & Java, Gunter Saake et. al, 1. Auflage 2000, dpunkt.verlag 1. http://download.oracle.com/javadb/ 2. http://db.apache.org/derby/ 3. http://hsqldb.org/ 4. http://www.escha.net/java/books/javainsel8/ 5. http://is.uni-paderborn.de/fileadmin/informatik/ag-engels/lehre/ss08/daba/folien/daba08-kapitel-6.pdf 1. http://de.wikipedia.org/wiki/object_database_management_group 2. http://de.wikipedia.org/wiki/java_database_connectivity 3. http://de.wikipedia.org/wiki/embedded_sql 4. http://de.wikipedia.org/wiki/apache_derby 5. http://de.wikipedia.org/wiki/hsqldb 6. http://de.wikipedia.org/wiki/sqlj 29.03.11 - Benjamin Lietzau & Philipp Meyer Java und Datenbanken 46
Vielen Dank für Ihre Aufmerksamkeit! Benjamin Lietzau & Philipp Meyer FB 8 - Angewandte Informatik/Umweltingenierwesen benjamin.lietzau@stud.hs-owl.de philipp.meyer@stud.hs-owl.de www.hs-owl.de