JDBC
• Java DataBase Connectivity
• Standard zum Zugriff auf die Datenbank von Java Anwendungen
• Vorgehensweise:
– Erzeugen einer Verbindung zum DBMS – Erzeugen eines „Statements“ (DB-Befehl) – ggf. Parameterübergabe
– Ausführen des Befehls
– ggf. Auslesen des Ergebnisses
• Vorsicht: JDBC legt sich nicht auf SQL fest
Aufbau einer Verbindung
Connection conn = DriverManager.getConnection(
url_der_db, username, password)
• Treiber wird vom DBMS mitgeliefert
•url_der_db: Identikator der Instanz
•Username, Passwort: klar
•Weitere Einstellungen: Transaktionslevel, Puffer, etc. durch Programm oder Konfigurationsdatei
Lesen der Namen aller Profs
Statement s = conn.createStatement();
ResultSet r;
s.execute(„SELECT name FROM professoren“);
r = s.getResultSet();
while (r.next()) {
output(r.getString(1));
}
r.close();
Anfragen mit Parameter
PreparedStatement s = conn.prepareStatement(
„SELECT name FROM profs WHERE rang = ?);
ResultSet r;
...
s.setString(1, „C3“);
r = s.executeQuery();
while (r.next()) ...
Tipps und Tricks
Connection Pooling
• Erzeuge mehrere Verbindungen zum Datenbanksystem
• Vor jedem Zugriff, belege eine freie Verbindung
• Führe Zugriff über diese Verbindung durch
• Vorteil: Eine langandauernde Datenbankoperation blockiert nicht andere. Andere Operationen
können über andere Verbindungen laufen
• Typische Anzahl von Verbindungen: 5 – 10, danach kontraproduktiv
Tipps und Tricks
Cursor Caching
• PreparedStatements für typische Operationen
• Beispiel:
insert into profs(name, rang) values(?,?)
• Belege ? mit Werten vor jeder Berufung
• Vorteil: Aufwand für Berufung wird reduziert
• Nachteil: Anfrageoptimierer hat keine Statistiken für ?
Zusammenfassung
• Einfacher Mechanismus zum Senden von Befehlen und Empfangen von Ergebnissen
• SQL Syntax wird nicht zur Übersetzungszeit
überprüft (!!!) Aus Sicht von Java sind Anfragen einfach nur Strings
• Typsicherheit der Parameter wird auch erst zur Laufzeit überprüft
• Alle JDBC Statements schmeißen SQLExceptions
• Neuere Standards: SQLJ – mehr Komfort und mehr Sicherheit zur Übersetzungszeit
SQL J
• Eingebettetes SQL in Java
• Strenge Typisierung durch Präprozessor
• Markierung von SQL Anweisungen durch #
• Ähnliches Iterator (Cursor) Prinzip wie in JDBC
#sql iterator ProfIterator(String name, String rang);
ProfIterator myProfs;
#sql myProfs = { SELECT name, rang FROM Professoren };
while (myProfs.next()) {
System.out.println(myProfs.name() + myProfs.rang());
}