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()); }