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

Uebung11SS04