180 likes | 314 Views
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. Übersicht.
E N D
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 JDBC
Übersicht • Verbindung zur DB: Interface Connection • Anfragen formulieren: Statement • Ergebnisse auswerten: ResultSet • Metadaten über die DB JDBC
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 JDBC
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) JDBC
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 JDBC
Statements • sind gewöhnliche SQL-Statements, die JDBC an die DB weiterleitet • erzeugt wird ein Statement über das Interface Connection Statement stmt = con.createStatement(); JDBC
Beispiel - CREATE • Ausführung von stmt.execute( "CREATE TABLE coworkers( c_id int, name varchar(25))" ); • kein ';' am Ende des Statements! JDBC
Beispiel - INSERT stmt.execute( "INSERT INTO coworkers VALUES (1, 'Herbert')" ); stmt.close(); JDBC
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)" ); JDBC
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(); JDBC
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"); JDBC
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 (?, ?)" ); JDBC
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(); JDBC
getXXX-Methoden JDBC
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 JDBC
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 ... JDBC