Motivation(I) • JDBC keine Abkürzung, sondern geschützter Name (inoffiziell: für Java Database Connectivity) • unterschiedliche DBS haben unterschiedliche Programmierschnittstellen • somit schwer, DBMS-unabhängige Anwendungen zu entwickeln und Probleme bei Portierung auf andere DBMS • deshalb JDBC entwickelt JDBC 1 Motivation (II) • mit selben Quellcode jede beliebige DB angesprechen (Voraussetzung Treiber und ANSI SQL-2 Fähigkeit der DB) • einfacher Zugriff aus Java auf bestehende Datenbanken • Plattform- und datenbankunabhängig • seit JDK1.1 Bestandteil der JavaStandarddistribution JDBC 2 Bestandteile (I) • Klassen und Schnittstellen des package java.sql bzw. javax.sql • Drivermanager – Einstiegspunkt, – Treiber registriert, – DB-Verbindung aufgebaut • Connection – repräsentiert DB-Verbindung – eine Anwendung kann mehrere DBs öffnen JDBC 3 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 4 Treibermanager • führt Liste mit allen geladenen Treibern • alle Verbindungen vom Programm zur Datenbank laufen über ihn • Treiber aufgrund Verbindungsinformationen gewählt • Treiberkonzept bewirkt Flexibilität von JDBC JDBC 5 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 6 Connection • 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 7 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 8 Statement • Drei Arten für Ausführung von SQL: – Statement: einfacher SQL-Befehl – PreparedStatement: vorkompilierter SQL-Befehl – CallableStatement: Aufruf einer Prozedur • Anfragen (createQuery) • Einfüge-, Änderungs- und Löschoperationen sowie DDL-Anweisungen (createUpdate) – Rückgabewert kein ResultSet sondern Anzahl betroffener Tupel oder 0 bei DDL-Befehlen JDBC 9 PreparedStatement (I) • Zeichenkette mit SQL-Anweisung bei Erzeugung des Objektes zu DBMS gesendet, dort kompiliert und zur Ausführung vorbereitet • Laufzeitvorteile, wenn Anweisung mehrfach mit verschiedenen Parametern ausgeführt • für endgültige Ausführung: IN-Parameter übergeben JDBC 10 PreparedStatement(II) PreparedStatement pstmt = con.prepareStatement(“select * from table where name=?”); pstmt.setString(1, “test”); ResultSet rs = rs.executeQuery(); JDBC 11 Fehlerbehandlung • JDBC kontrolliert nicht, ob Anfrage richtig, wenn falsch von DB Fehler erzeugt • Fehler bei Verbindungsproblemen oder DBMS- oder Hardwarefehler • Fehler als Exceptions signalisiert – mit try und catch abfangen • Exception bedeutet nicht unbedingt, dass Methode nicht ausgeführt besser explizit zurücksetzen JDBC 12 Metadaten • Informationen über die Datenbank – DB-Schema, SQL-Dialekt, implementierte Operationen • Schnittstelle java.sql.ResultSetMetaData: – Struktur des ResultSet rs.getColumnCount(); • java.sql.DatabaseMetaData: – Struktur DB oder DBMS dmd.getURL(); JDBC 13 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 14 Neuerungen in JDBC 2.1(I) • Scrollbare ResultSets – rückwärts durchlaufen – sensitiv Datenänderungen noch nach Öffnen des ResultSets aktualisiert • Änderbare ResultSets – Tupel einer Ergebnismenge ändern (Änderungen wirken sich auf Datenbank aus) • SQL99-Datentypen – benutzerdefinierte Typen, BLOB, ARRAY... JDBC 15 Neuerungen in JDBC 2.1(II) • BatchUpdates – Ausführung mehrerer Änderungsoperationen als Batch (Performancegewinn) • Connection Pooling – 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 16 Neuerungen in JDBC 2.1(III) • Erweiterungen können Entwicklung von Anwendungen erleichtern • viele neue Eigenschaften optional und müssen nicht von JDBC-Treibern unterstützt werden • alte Treiber weiter nutzbar (unterstützen aber Neuerungen nicht) JDBC 17 Quellen • 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 JDBC 18