JDBC
description
Transcript of JDBC
JDBC
-Java Database Connectivity-
30.4.2003 JDBC 2
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 3
Übersicht
• Verbindung zur DB: Interface Connection
• Anfragen formulieren: Statement• Ergebnisse auswerten: ResultSet
• Metadaten über die DB
30.4.2003 JDBC 4
JDBC-Treiber
• zunächst wird ein DB-spezifischer JDBC-Treiber geladenDriverManager.registerDriver(new oracle.jdbc.OracleDriver());
• DB-Systeme liefern i.d.R. passende JDBC-Treiber mit, wenige sind frei verfügbar
30.4.2003 JDBC 5
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 6
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 ConnectionURL = jdbc:oracle:thin:@141.20.27.142:1521:LEHRE
30.4.2003 JDBC 7
Statements
• sind gewöhnliche SQL-Statements, die JDBC an die DB weiterleitet
• erzeugt wird ein Statement über das Interface ConnectionStatement stmt =
con.createStatement();
30.4.2003 JDBC 8
Beispiel - CREATE
• Ausführung vonstmt.execute(
"CREATE TABLE coworkers(
c_id int,
name varchar(25))"
);• kein ';' am Ende des Statements!
30.4.2003 JDBC 9
Beispiel - INSERT
stmt.execute(
"INSERT INTO coworkers
VALUES (1, 'Herbert')"
);
stmt.close();
30.4.2003 JDBC 10
Queries
• Ausführung von SELECT-Statements über Statement.executeQuery(), was ein Objekt des Interfaces ResultSet erzeugtResultSet result =
stmt.executeQuery(
"SELECT c_id, name FROM
coworkers ORDER BY c_id)"
);
30.4.2003 JDBC 11
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 12
Zugriff auf ResultSet
• über die MethodenResultSet.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 13
Prepared Statements
• für mehrfache Abarbeitung und wenn die DB vorbereitete Anweisungen unterstützt
• anstelle von StatementPreparedStatement pstmt = con.prepareStatement( "INSERT INTO coworkers (c_id, name) VALUES (?, ?)" );
30.4.2003 JDBC 14
Prepared Statements
{LOOP}// prepare tuples:// integer as 1st attribute:pstmt.setInt(1, anInt);
// string as 2nd attribute:pstmt.setString(2, aString);
// execute prepared statementpstmt.execute();
{POOL}pstmt.close();
30.4.2003 JDBC 15
getXXX-Methodenget-Methode SQL-Typ
getInt INTEGER
getString CHAR, VARCHAR
getLong BIG INT
getFloat REAL
getDouble FLOAT
getBoolean BIT
getDate, getTime DATE, TIME
getInt INTEGER
getObject jeder Typ
30.4.2003 JDBC 16
30.4.2003 JDBC 17
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 18
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 ...