jdbc

Werbung
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
Herunterladen