Eine Einführung in die Anwendung von JDBC - Java Database Connectivity Tim München Michael Lambers 18. November 2005 Überblick ● JDBC-Grundlagen ● Nutzung von JDBC-Treibern ● Programmbeispiel JDBC - Grundlagen ● Java Database Connectivity ● SQL-konforme API von Sun Microsystems ● ● ● ● Interfaces in den Packages java.sql und javax.sql Treiber implementieren diese Interfaces Entwicklung von Anwendungen ohne Berücksichtung der Spezifikationen der einzelnen Datenbanksysteme Vier Treibertypen JDBC – Treibertypen Typ 1 - Treiber Typ 2 - Treiber Typ 3 - Treiber Typ 4 - Treiber Client-Rechner Java-VM Java-Applikation JDBC-Schnittstelle Java-ODBC bridge (SUN) DB-unabhängig JDBCNetzwerktreiber DB-unabhängig Java-API DB-abhängig ODBCSchnittstelle Client-Bibliothek DB-abhängig ODBC-ClientBibliothek DB-abhängig Netzwerk MiddlewareServer Datenbankserver DBMS Java-Treiber DB-abhängig Überblick ● JDBC-Grundlagen ● Nutzung von JDBC-Treibern ● Programmbeispiel JDBC - Verbindungsaufbau ● 1. Schritt: Laden des Treibers Class.forName("Treiberklasse").newInstance(); ● 2. Schritt: Herstellen der Verbindung java.sql.Connection conn = DriverManager.getConnection("url", "user", "password"); DB-Metadaten (1) ● ● Allgemeine Informationen Eigenschaften und Fähigkeiten der verwendeten Datenbank ● Vorhandene Tabellen ● Zugriffsrechte DB-Metadaten (2) ● 1. Schritt: Metadaten abrufen java.sql.DatabaseMetaData dmd = conn.getMetaData(); ● 2. Schritt: Abfrage z. B. der Datenbankversion String dbname = dmd.getDatabaseProductName(); String dbversion = dmd.getDatabaseProductVersion(); SQL-SELECT (1) ● 1. Schritt: Statement erzeugen java.sql.Statement s = conn.createStatement(); ● 2. Schritt: Durchführen der Abfrage java.sql.RecordSet rs = s.executeQuery("SELECT ..."); SQL-SELECT (2) ● 3. Schritt: Daten ausgeben while (rs.next()) { int alter = rs.getInteger(1); String name = rs.getString(2); System.out.println(...); } while (rs.next()) { int alter = rs.getInteger("alter"); String name = rs.getString("name"); System.out.println(...); } RecordSet-Metadaten (1) ● Allgemeine Informationen ● Eigenschaften der Attribute – Bezeichnung – Datentyp – Größe – nullable? RecordSet-Metadaten (2) ● 1. Schritt: Metadaten abfragen java.sql.ResultSetMetaData rsmd = rs.getMetaData(); ● 2. Schritt: z. B. Anzahl der Attribute abfragen int count = rsmd.getColumnCount(); Prepared Statements (1) ● Problem: Viele nahezu identische SQL-Befehle INSERT INTO tabelle VALUES (a1, b1, c1); INSERT INTO tabelle VALUES (a2, b2, c2); INSERT INTO tabelle VALUES (a3, b3, c3); ... ● Lösung: Einsatz von Prepared Statements INSERT INTO tabelle VALUES (?, ?, ?); Prepared Statements (2) ● Schritt 1: Erzeugen des Prepared Statements java.sql.PreparedStatement ps = conn.preparedStatement( "INSERT INTO tabelle VALUES (?, ?)"); ● Schritt 2: Füllen mit Daten ps.setInt(1, 4711); ps.setString(2, "Testtext"); ● Schritt 3: Abschicken der Daten ps.execute(); Fehlerbehandlung (1) ● ● Fehlgeschlagene JDBC-Calls werfen SQLExceptions Beispiel: try { ... } catch (SQLException e) { System.out.println(e.toString()); e.printStackTrace(); ... } Fehlerbehandlung (2) ● Bei „harmlosen“ Problemen treten SQLWarnungen auf – – ● eingefügter Text zu lang Konvertierungsprobleme Separates Abfragen der SQL-Warnungen nötig statement.executeUpdate(...); java.sql.SQLWarning sw = statement.getWarnings(); while (sw!=null) { System.out.println(sw.toString()); sw = sw.getNextWarning(); } Überblick ● JDBC-Grundlagen ● Nutzung von JDBC-Treibern ● Programmbeispiel Weitere Informationen ● ● http://java.sun.com/docs/books/tutorial/jdbc /basics/index.html http://dev.mysql.com/doc/refman/4.1/en /java-connector.html Vielen Dank für eure Aufmerksamkeit