JDBC – Datenzugriff aus Java ETIS SS04 Gliederung • • • • • Motivation Bestandteile Fehlerbehandlung Metadaten Zusammenfassung JDBC 2 Motivation(I) • Standard für Zugriff auf Datenquellen aus JavaAnwendungen – 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 DDLAnweisungen) – 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 – – – – JDBC 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) 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 StatementParametern – Verbesserungen bei Result-Sets JDBC 24