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