JDBC -Java Database Connectivity- JDBC .. • .. verbindet Java-Programme mit SQL-basierten Datenbanken • .. liefert eine generische SQL-API für eine Vielzahl von DB-Systemen • .. ist für Programmierer (fast) transparent • .. findet sich im Package java.sql 15./22. April 2004 JDBC 2 Übersicht • Verbindung zur DB: Interface Connection • Anfragen formulieren: Statement • Ergebnisse auswerten: ResultSet • Metadaten über die DB 15./22. April 2004 JDBC 3 JDBC-Treiber • zunächst wird ein DB-spezifischer JDBC-Treiber geladen DriverManager.registerDriver(new oracle.jdbc.OracleDriver()); • DB-Systeme liefern i.d.R. passende JDBC-Treiber mit, wenige sind frei verfügbar 15./22. April 2004 JDBC 4 JDBC-Treiber • Einbindung des Treibers auch zur Laufzeit möglich > java -Djdbc.drivers= oracle.jdbc.OracleDriver myClass • für manche Systeme gibt es nur ODBC-Treiber, aber zum Glück auch die JDBC-ODBC-Bridge 15./22. April 2004 JDBC 5 Verbindung zur DB • die eigentliche Verbindung stellt die Klasse DriverManager her: Connection con = DriverManager.getConnection(URL, username, password); • URL = JDBC-Connect-String • sämtliche Anfragen an die DB behandelt dann die Instanz des Interfaces Connection URL = jdbc:oracle:thin:@141.20.27.142:1521:LEHRE 15./22. April 2004 JDBC 6 Statements • sind gewöhnliche SQL-Statements, die JDBC an die DB weiterleitet • erzeugt wird ein Statement über das Interface Connection Statement stmt = con.createStatement(); 15./22. April 2004 JDBC 7 Beispiel - CREATE • Ausführung von stmt.execute( "CREATE TABLE coworkers( c_id int, name varchar(25))" ); • kein ';' am Ende des Statements! 15./22. April 2004 JDBC 8 Beispiel - INSERT stmt.execute( "INSERT INTO coworkers VALUES (1, 'Herbert')" ); stmt.close(); 15./22. April 2004 JDBC 9 Queries • Ausführung von SELECT-Statements über Statement.executeQuery(), was ein Objekt des Interfaces ResultSet erzeugt ResultSet result = stmt.executeQuery( "SELECT c_id, name FROM coworkers ORDER BY c_id)" ); 15./22. April 2004 JDBC 10 ResultSet • zurückgelieferte Tupel nimmt eine Instanz von ResultSet auf • die Ergebnisse werden tupelweise durchlaufen über die Methode result.next(); • bereits das erste Tupel bedarf des Einstiegs mit result.next(); 15./22. April 2004 JDBC 11 Zugriff auf ResultSet • über die Methoden ResultSet.getXXX("<attrib>") • also getString(), getInt() stmt.executeQuery("SELECT c_id,name .. while(result.next()) { int c_id = result.getInt("c_id"); String name = result.getString("name"); 15./22. April 2004 JDBC 12 Prepared Statements • für mehrfache Abarbeitung und wenn die DB vorbereitete Anweisungen unterstützt • anstelle von Statement PreparedStatement pstmt = con.prepareStatement( "INSERT INTO coworkers (c_id, name) VALUES (?, ?)" ); 15./22. April 2004 JDBC 13 Prepared Statements {LOOP} // prepare tuples: // integer as 1st attribute: pstmt.setInt(1, anInt); // string as 2nd attribute: pstmt.setString(2, aString); // execute prepared statement pstmt.execute(); {POOL} pstmt.close(); 15./22. April 2004 JDBC 14 getXXX-Methoden get-Methode SQL-Typ getInt INTEGER CHAR, VARCHAR BIG INT REAL FLOAT BIT DATE, TIME INTEGER jeder Typ getString getLong getFloat getDouble getBoolean getDate, getTime getInt getObject 15./22. April 2004 JDBC 15 15./22. April 2004 JDBC 16 SQLExceptions • "Geschlossene Anweisung" – Wo? Statement.execute() – Was? Es wird auf ein Instanz von Statement zugegriffen, die zuvor mit Statement.close() geschlossen wurde – Und jetzt? Erst später schließen oder neu instanziieren 15./22. April 2004 JDBC 17 SQL-Exceptions 2 • "ORA-00001: Verstoß gegen Eindeutigkeit" – Wo? Statement.execute("INSERT .."); – Was? Einfügen bereits vorhandener Werte in eine als unique/primary key deklarierte Spalte – Und jetzt? Altes Tupel überschreiben oder anderer Wert ... 15./22. April 2004 JDBC 18