JDBC Datenzugriff aus Java ETIS SS04
Gliederung Motivation Bestandteile Fehlerbehandlung Metadaten Zusammenfassung JDBC 2
Motivation(I) Standard für Zugriff auf Datenquellen aus Java- Anwendungen RDBs, Flat Files, Spread Sheets Bestandteil Java-Standarddistribution seit JDK 1.1 aktuell: Version 3.0 JDBC keine Abkürzung inoffiziell: Java Database Connectivity einfacher Zugriff aus Java auf Datenquellen plattform- und datenbankunabhängig write once run anywhere JDBC 3
Motivation (II) unterschiedliche DBS besitzen unterschiedliche Programmierschnittstellen somit: schwer, DBMS-unabhängige Anwendungen zu entwickeln Probleme bei Portierung auf andere DBMS deshalb: JDBC entwickelt somit: selber Quellcode für Kommunikation mit beliebiger DB (Voraussetzung: JDBC-Treiber und ANSI SQL-2 Fähigkeit der DB) JDBC 4
Bestandteile (I) Klassen und Schnittstellen des package java.sql bzw. javax.sql DriverManager Einstiegspunkt, hält Liste registrierter Treiberklassen versucht Treiber zu lokalisieren + DB-Verbindung aufzubauen DataSource repräsentiert Datenquelle in Java Alternative zum DriverManager arbeitet mit JNDI (Features wie Connection Pooling, verteilte Transaktionen + Wartbarkeit verbessert) JDBC 5
Bestandteile(II) Connection repräsentiert Verbindung zu Datenquelle beinhaltet auszuführende SQL-Statements + zurückgegebene Ergebnisse eine Anwendung kann eine oder mehrere Verbindungen zu einer oder mehreren Datenquellen haben JDBC 6
Bestandteile(II) Statement ermöglicht Ausführung von SQL-Anweisungen über gegebene Verbindung ResultSet verwaltet Ergebnisse einer Anfrage unterstützt Zugriff auf einzelne Spalten JDBC 7
Treibermanager führt Liste mit allen geladenen Treibern alle Verbindungen vom Programm zur Datenbank laufen über ihn Treiber aufgrund Verbindungsinformationen gewählt registrierte Treiber entsprechend ihrer Reihenfolge getestet erster passender ausgewählt Treiberkonzept bewirkt Flexibilität von JDBC JDBC 8
Treiber Treiber Schnittstelle zwischen JDBC und DB Austausch Treiber ermöglicht Zugriff auf andere DB mit selben Quellen d.h. jedes DBMS benötigt eigenen Treiber explizites Laden im Programm: Class.forName( jdbc.odbc.jdbcodbcdriver ); Java-Classloader lokalisiert Treiber und lädt und linkt ihn automatisch danach registriert sich Treiber selbständig beim Treibermanager JDBC 9
Connection (I) repräsentiert Verbindung zur Datenbank Verbindungsaufbau: Connection con = DriverManager.getConnection( String url, String name, String passwort); Url: jdbc:<subprotocol>:<subname> Ablauf JDBC-DB-Anwendung: Verbindungsaufbau zur DB SQL-Anweisung senden Anfrageergebnisse verarbeiten JDBC 10
Connection (II) Connection Pooling (seit 2.0) da Connectionaufbau teure Operation Reduzierung Verbindungsauf- und -abbau wenn DB-Verbindung geschlossen, nicht beendet, sondern markiert will andere Anwendung Verbindung öffnen, Prüfung, ob passende Verbindung in Pool - nur wenn nein, neue aufgebaut JDBC 11
Statement + ResultSet Statement stmt = connection.createstatement(); ResultSet rs = stmt.executequery( select... ); while(rs.next()){ System.out.println(rs.getString( name )); } rs.close(); stmt.close(); JDBC 12
Statement (I) Drei Arten für Ausführung von SQL (Interfaces bauen aufeinander auf): Statement: einfacher SQL-Befehl PreparedStatement: vorkompilierter SQL-Befehl CallableStatement: Aufruf einer Prozedur Methoden für Abfragen von Ergebnissen: createquery (Anfragen) createupdate (Einfügen, Ändern, Löschen sowie DDL- Anweisungen) seit 2.0: BatchUpdates (Ausführung mehrerer Updates als Stapel - Performancegewinn) JDBC 13
Statement (II) Methoden für Ausführen von Statements: executequery (Anfragen) executeupdate (Änderungsoperation + DDL-Befehle) execute (mehr als ein ResultSet oder update count zurückgegeben) Escape Syntax ermöglicht mehr DB-Unabhängigkeit Connections, Statements, ResultSets immer explizit schliessen, um Ressourcen so früh wie möglich frei zu geben JDBC 14
PreparedStatement(I) PreparedStatement pstmt = con.preparestatement( select * from person where name =? and vorname =? ); pstmt.setstring(1, Lustig ); pstmt.setstring(2, Peter ); ResultSet rs = rs.executequery(); JDBC 15
PreparedStatement (II) Zeichenkette mit SQL-Anweisung bei Erzeugung des Objektes zu DBMS gesendet, dort kompiliert und zur Ausführung vorbereitet Parameter unbekannt, wenn Statement kreiert? Platzhalter für Parameter für endgültige Ausführung: IN-Parameter übergeben Parameter gültig bis Aufruf clearparameter oder neu gesetzt Laufzeitvorteile, wenn Anweisung mehrfach mit verschiedenen Parametern ausgeführt JDBC 16
ResultSet (I) Java-Objekt, das Ergebnisse einer Anfrage enthält Anfrageergebnisse haben Tabellenform (besitzen Zeilen und Spalten) Ergebnisse durch getter abfragbar ResultSet hat Cursor steht zunächst vor 1. Tupel gültig bis ResultSet oder Statement geschlossen mit next() vorwärts seit 2.0: Scrollbare ResultSets (vor-, rückwärts durchlaufen + zu bestimmter Stelle springen) JDBC 17
ResultSet (II) weitere Neuerungen 2.0 Datenänderungen noch nach Öffnen des ResultSets aktualisiert änderbare ResultSets, d.h. Tupel der Ergebnismenge in ResultSet und Datenbank änderbar SQL99-Datentypen (benutzerdefinierte Typen, BLOB, ARRAY...) JDBC 18
Fehlerbehandlung Problem: DBMS nutzen z.t. alten oder propritären SQL-Syntax Lösung: JDBC kontrolliert nicht, ob Anfrage richtig, Nutzer kann jegliche DBMS-Funktionalität nutzen wenn Anfrage falsch von DB Fehler erzeugt auch Fehler bei Verbindungsproblemen, DBMS- oder Hardwarefehlern Fehler als Exceptions signalisiert mit try und catch abfangen Exception bedeutet nicht unbedingt, dass Methode nicht ausgeführt besser explizit zurücksetzen JDBC 19
Metadaten DBMS haben unterschiedliche Feature, Datentypen Metadaten informieren über die Datenbank DB-Schema, SQL-Dialekt, implementierte Operationen java.sql.databasemetadata: Informationen zur Struktur DB oder DBMS dmd.geturl(); Anfrage zur Laufzeit vom Nutzer eingegeben, Informationen über ResultSet nötig Schnittstelle java.sql.resultsetmetadata: Informationen zur Struktur des ResultSet rs.getcolumncount(); JDBC 20
Zusammenfassung Standard für DB-Zugriff aus Java plattform- und datenbankunabhängig grundlegende Feature einfach, schnell erlernbar vor 3.0 hauptsächlich grundlegende Möglichkeiten zum Zugriff von Javaprogrammen auf Datenbanken ab 3.0 DB-Zugriff aus Application Server Schicht (Connection-Pooling-Konfiguration) viele neue Eigenschaften (ab 2.0) optional und müssen nicht von JDBC-Treibern unterstützt werden alte Treiber weiter nutzbar JDBC 21
Literatur Saake, G., Sattler, K.: Datenbanken & Java: JDBC, SQLJ und ODMG dpunkt.verlag, Heidelberg, Mai 2000. http://java.sun.com/products/jdbc/ http://java.seite.net/jdbc/treiber.html http://java.sun.com/j2se/1.4.2/docs/guide/jdbc/getstar t/gettingstartedtoc.fm.html Jansen, R.: Tuning-Center, Java Magazin,7/2003, S.80: Neuerungen aus JDBC 3.0 am Beispiel der Oracle-Datenbank JDBC 22
Transaktionen i.d.r. Verbindungen im autocommit-modus gestartet (einzelnes Statement sofortige Auswirkung auf Datenbank) mehrere Operationen zusammenfassen: connection.setautocommit(false); so: Änderungen zu beliebigen Zeitpunkt dauerhaft in DB geschrieben (commit()) oder Änderungen aktueller Transaktion rückgängig gemacht (rollback()) JDBC 23
Neuerungen in JDBC 3.0 im Vordergrund DB-Zugriff aus Application Server Schicht Connection-Pooling-Konfiguration Savepoints Wiederverwendung von Prepared Statements Zugriff auf automatisch generierte Schlüssel Zugriff auf Metainformtionen von Statement- Parametern Verbesserungen bei Result-Sets JDBC 24