Wichtige Klassen der JDBC-API
[Zurück] [Übersicht
Präsentation] [Weiter]
Driver
-
arbeitet normalerweise im Hintergrund, da sie von DriverManager-Klasse
aufgerufen wird
-
der Treibermanager ruft die Methode connect
auf, die die registrierten Treiber durchgeht und den ersten nimmt, der
die Anforderungen erfüllt
-
die weiteren Methoden stellen Informationen über den
Treiber oder den Aufbau der Verbindung zur Verfügung
DriverManager
-
Verwaltungsebene zwischen Benutzer
und Treiber
-
Aufbau der Verbindung durch die Methode DriverManager.getConnection(),
welche ein Connection-Objekt liefert
-
verwaltet eine Liste von Treiber,
die sich selbst registriert haben (Driver-Methode
registerDriver()), was beim Laden eines Treibers geschehen sollte
-
für das Laden von Treibern gibt es zwei Möglichkeiten
:
-
durch expliziten Aufruf von Class.forName("sun.jdbc.odbc.JdbcOdbcDriver")
-
durch Hinzufügen zu der java.lang.System-Eigenschaft
jdbc.drivers durch jdbc.drivers=sun.jdbc.odbc.JdbcOdbcDriver
Connection
-
stellt Verbindung zu einer Datenbank dar
-
sendet Transaktionen zu einer Datenbank
-
3 Klassen zum Senden von SQL-Anweisungen
:
-
Statement,
-
PreparedStatement und
-
CallableStatement
Transaktionen/Isolationsgrade
-
bestehen aus einer oder mehreren SQL-Anweisungen
-
standard : Auto-commit-Modus ein,
also wird nach Beendigung einer SQL-Anweisung die Anweisung abgeschickt
(Methode commit aufgerufen), die Transaktion besteht aus einer SQL-Anweisung
-
ist der Auto-commit-Modus aus, werden die Anweisungen gesammelt
und nach expliziten Aufruf der Methode commit abgeschickt
-
bei mehrfach Zugriffen auf eine Datenbank wird, können
Dirty-Reads auftreten, hierfür kann man Isolationsgrade setzen
-
Je höher der Grad desto langsamer ist die Anwendung.
Man muß also zwischen Performanz und Datensicherheit
entscheiden
allgemein für die 3 Klassen Statement,PreparedStatement
und CallableStatement
-
3 Methoden zum Ausführen einer SQL-Anweisung
-
executeQuery : für eine
Anweisung, die eine Ergebnismenge liefert (SELECT)
-
executeUpdate : für INSERT,
UPDATE, DELETE, CREATETABLE und DROPTABLE, die einen int-Wert (Anzahl der
betroffenen Zeilen,bei CREATETABLE und DROPTABLE wird 0 zurückgegeben)
-
execute : liefert mehere Ergebnismengen,
Update-Zähler oder eine Kombination aus beidem; wird selten von Programmierern
benutzt
Statement
-
erzeugt durch Connection-Methode createStatement()
(Anweisung : Statement stmt = con.createStatement();)
-
Beispiel für das Absenden einen Statement-Objekts :
ResultSet rs=stmt.executeQuery("SELECT * FROM
protokoll")
-
mit stmt.close() wird ein Statement-Objekt
geschlossen
PreparedStatement
-
erbt von Statement
-
Instanzen von PreparedStatement enthalten
eine bereits übersetzte SQL-Anweisung
-
SQL-Anweisungen können einen oder mehrere IN-Parameter
enthalten
-
für IN-Parameter werden steht ein ? als Platzhalter
-
erzeugt durch Connection-Methode prepareStatement(String
SQL-Anweisung):
PreparedStatement pstmt = con.prepareStatement("INSERT INTO protokoll values
(?,?,?,?,?)");
-
Setzen der IN-Parameter mit der entsprechenden set-Methode
: Setzen des 2.Parameter durch pstmt.setString(1,"NAME")
-
IN-Parameter bleiben gesetzt, solange sie nicht durch ein
neues Setzen geändert werden oder durch clearParameters gelöscht
werden
-
Die drei Methoden executeQuery, executeUpdate und execute
sind modifiziert, sie enthalten keine Parameter mehr : pstmt.executeUpdate()
führt die Anweisung aus
-
schneller als Statement, da
PreparedStatement-Objekte vorübersetzt sind
-
zu beachten ist, daß manche DBMS PreparedStatement
nicht über ein commit hinaus behält, so daß sie wieder
neu übersetzt werden muß, dann sind Statement effizienter
CallableStatement
-
erbt Methoden von Statement und von PreparedStatement die
set-Methode
-
ob ein DBMS CallableStatement unterstützt erfährt
man durch die DatabaseMetaData-Methode supportsStoredProcedures
-
erzeugt durch ConnectionMethode prepareCall(String preparedCall)
: CallableStatement cstmt = con.prepareCall("{call getTest(?,?)}")
-
ermöglicht den für alle RDBMS standardisierten
Aufruf gespeicherter Prozeduren
-
gespeicherte Prozeduren sind in der Datenbank abgelegt.
Ein CallableStatement ruft diese auf
-
2 Formen von Aufrufen
-
mit Ergebnisparameter
z.B. {?=call procedure_Name[(?,?)]}
-
ohne Ergebnisparameter
z.B. {call procedure_Name[(?,?)]} , wobei [..] optionaler Inhalt ist
-
ein Ergebnisparameter ist der Rückgabewert der gespeicherten
Prozedure (eine Art von OUT-Parameter)
-
Beide Formen haben eine variable Anzahl von IN-Parametern,
OUT-Parametern und INOUT-Parameter (wieder ist ein ? der Platzhalter)
-
IN-Parameter werden wie oben erwähnt gesetzt
-
OUT-Parameter werden durch cstmt.registerOutParameter(1,java.swl.Types.TINYINT)
registriert und durch cstmt.getByte(1) ausgelesen
-
INOUT ist ein Kombination aus Beidem, wobei man erst den
Typ setzt und dann registriert. Allerdings müssen IN und OUT vom gleichen
JDBC-Typ sein
Auswerten der Ergebnismenge ResultSet
-
wurde bei ResultSet rs = stmt.executeQuery("SELECT * FROM
gruppe") gesetzt
-
enthätlt eine Tabelle, die durch die Ausführung
einer SQL-Anweisung bestimmt wird
-
auswerten der Anzahl der Spalten über ResultSetMetaData
: ResultSetMetaData rsmd = rs.getMetaData(); int columns = rsmd.getColumns();
-
Der Zeiger, der auf die aktuelle Zeile zeigt, steht am Anfang
vor der ersten Zeile
-
Man greift auf die Spaltenwerte mit get-Methoden zu durch
2 Methoden :
-
(Beispiel auf einen String)
-
durch s=rs.getString(2) auf den String der in der 2.Spalte
der aktuellen Zeile steht oder
-
durch s=rs.getString("Name") auf die 2.Spalte, wenn diese
den Name "Name" trägt
-
Die Spalten sind von links nach rechts beginnend mit 1 numeriert
sind
-
Auswerten jeder Zeile einer Tabelle
durch
while
(rs.next()){
// Zeileninhalt Zelle für Zelle ausgeben:
for (int i = 1; i <= columns; i++) {
Object o = rs.getObject(i);
if (rs.wasNull()) o = new String("NULL");
if (o == null) o = new String("*NULL*");
sb.append(o.toString() + "\n");
}
}
DatabaseMetaData/ResultSetMetaData
-
Diese beiden Klassen liefern
etliche Methoden zum Abfragen von Informationen über
die Datenbank oder der Ergebnismenge
-
DatabaseMetaData werden durch DatabaseMetaData
dbmd =con.getMetaData() erzeugt
-
z.B. : dbmd.supportsStoredProzedure gibt true zurück,
wenn diese unterstützt werden
-
ResultSetMetaData wird durch ResultSetMetaData
rsmd=rs.getMetaData(), wobei rs ein ResultSet ist erzeugt
-
mit rsmd.getColumns() erhält man also die Spaltenanzahl
-
Man muß sich die JDBC-API anschauen, um die Methode,
die man braucht, zu finden
Autor: Sven Garske
Autor: Jörn Hauswald
Last Updated on $Date: 1998/08/18 20:35:03 $