JDBC – Datenzugriff aus Java
ETIS SS04
JDBC 2
Gliederung• Motivation• Bestandteile• Fehlerbehandlung• Metadaten• Zusammenfassung
JDBC 3
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 4
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 5
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 6
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 7
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 8
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 9
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 10
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 11
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 12
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 13
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 14
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 15
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 16
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 17
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 18
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 19
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 20
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 21
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 22
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 23
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 24
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