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 30.4.2003 JDBC 2 Übersicht • Verbindung zur DB: Interface Connection • Anfragen formulieren: Statement • Ergebnisse auswerten: ResultSet • Metadaten über die DB 30.4.2003 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 30.4.2003 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) 30.4.2003 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 30.4.2003 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(); 30.4.2003 JDBC 7 Beispiel - CREATE • Ausführung von stmt.execute( "CREATE TABLE coworkers( c_id int, name varchar(25))" ); • kein ';' am Ende des Statements! 30.4.2003 JDBC 8 Beispiel - INSERT stmt.execute( "INSERT INTO coworkers VALUES (1, 'Herbert')" ); stmt.close(); 30.4.2003 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)" ); 30.4.2003 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(); 30.4.2003 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"); 30.4.2003 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 (?, ?)" ); 30.4.2003 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(); 30.4.2003 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 30.4.2003 JDBC 15 30.4.2003 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 30.4.2003 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 ... 30.4.2003 JDBC 18