Upload
others
View
1
Download
0
Embed Size (px)
Citation preview
JDBCLiteratur
Datenbanken
Sammeln, Zugreifen und Verwalten von Daten
in der Computerwelt geschieht das mit Datenbanken
Datenbank Management System (DBMS)
verschiedene Speicherformen: relationales Modell,OO-Datenbanken, XML-Datenbanken
3 / 50
JDBCLiteratur
Datenbanken
relationale Datenbanken bestehen aus Tabellen mit Zeilen(Tupel) und Spalten (Attribute)
Zeilen einer Relation Datenbankauspragung
Datenbankschema beschreibt die Struktur
viele verschiedene OpenSource und kommerzielle DBs
Oracle, MySQL, Microsoft Access ...
Zugriff auf Datenbank in Java mit JDBC
4 / 50
JDBCLiteratur
JDBC
Java Database Connectivity
Datenbankschnittstelle fur Java
ist unabhangig von konkreten Datenbanksystemen
unterstutzt alle wichtigen Merkmale die von einer relationalenDatenbankschnittstelle erwartet werden
dynamisches SQL, vorbereitetes SQL, aktualisierbare Cursor,vorwartsscrollbare Cursor und weitere
5 / 50
JDBCLiteratur
Komponenten von JDBC
JDBC-API zum Datenbankzugriff fur Anwendungsentwickler
um eine DB ansprechen konnen wird Treiber benotigt
JDBC-Treiber stellt die Implementierung derJDBC-Schnittstelle fur ein konkretes Datenbanksystem
der Treiber ubernimmt die Kommunikation mit demDatenbanksystem
JDBC-Treibermanager verwaltet JDBC-Treiber innerhalb derJava-Laufzeitumgebung
6 / 50
JDBCLiteratur
JDBC
JDBC-API legt fest durch welche Methodenaufrufe man ausJava auf rel. Datenbanken zugreifen kann
Schnittstelle mit Java-Interfaces die im Paket java.sqlenthalten sind
Zugriffsmethoden fur ein konkretes Datenbanksystem (Oracle,MySQL) sind nicht enthalten
Zugriff wird von JDBC-Treibern durchgefuhrt
7 / 50
JDBCLiteratur
Klassen in JDBC
DriverManager wird benutzt um Verbindung zur DBaufzubauen
Connection reprasentiert Verbindung wird benotigt furSQL-Anweisungen und Zugriff auf Metadaten
Statement Basis-Klasse fur SQL-Anweisungen
PreparedStatement vorbereitete Anweisung
ResultSet reprasentiert Ergebnis einer Anfrage
8 / 50
JDBCLiteratur
Vorgehen
Registrieren des JDBC-Treibers beim Treibermanager
Verbindungsaufbau zur DB
SQL-Anweisung erzeugen
Ausfuhren der SQL-Anweisung
Abfragen des Ergebnisses nach der Ausfuhrung
Schließen der Datenbank Verbindung
9 / 50
JDBCLiteratur
JDBC-Treiber
Treiber implementieren die Funktionen derJDBC-Schnittstellen aus java.sql
alle Datenbank spezifischen Zugriffsmethoden sind im Treibergekapselt
die Verwaltung des Treibers ubernimmt derJDBC-Treibermanager
will man eine Verbindung aufbauen registriert man denTreiber beim Treibermanager
bei Verbindungsaufbau zur DB wird vom Treibermanager derTreiber angefordert und initialisiert
10 / 50
JDBCLiteratur
Registrierung des Treibers
mehrere Moglichkeiten zur Registrierung des Treibers
Treiberklassen mussen sich im Klassenpfad befinden
statische Methode Class.forName()
erwartet vollqualifizierten Klassennamen des Treibers
Klasse wird gesucht, geladen und ins Laufzeit-Systemeingebunden
String driver = "oracle.jdb.driver.OracleDriver";
Class.forName(driver );
11 / 50
JDBCLiteratur
Registrierung des Treibers
weitere Moglichkeit Registrierung beim Aufruf des Interpreters
uber die Option -D die Property jdbc.drivers ubergeben
außerdem eine Liste von Klassennamen, die JDBC-Treiberimplementieren
Syntax:
java -Djdbc.drivers=<treiber1 >:..:< treiberN ><Klasse >
java -Djdbc.drivers=oracle.jdbc.driverOracleDriver <Klasse >
12 / 50
JDBCLiteratur
Verbindungs-URL
in JDBC wird Datenbankserver als URL angegeben
Syntax:
jdbc:<protokoll >:<subprotokoll >:<datenbank >
zuerst Schlusselwort jdbc
Name des verwendeten Protokolls (darunter ist der Treiberbeim Treibermanager registriert)
alles nach dem Protokoll ist treiberspezifisch und wird nurvom Treiber ausgewertet
String url = "jdbc:h2:testdb";
13 / 50
JDBCLiteratur
Verbindungsaufbau
Verbindungsaufbau uber den Treibermanager
Klasse DriverManager
definiert die Methode getConnection() mit jeweilsunterschiedlichen Parametern
als Ruckgabe bekommt man ein Connection-Objekt zuruck
String url = "jdbc:h2:testdb";
Sting user = "sa";
String password = "";
Connection con;
con = DriverManager.getConnection(url , user , password );
14 / 50
JDBCLiteratur
Protokollierung
Treibermanager-API verfugt uber integrierteProtokollierungsfunktionen
hilfreich zur Fehlersuche
ist per Voreinstellung deaktiviert und muss explizit aktiviertwerden
Methode setLogWriter()
kann jederzeit wieder deaktiviert werden
PrintWriter logger;
logger = new PrintWriter(new OutputStreamWriter(System.out));
DriverManager.setLogWriter(logger );
15 / 50
JDBCLiteratur
Datenbanksprache
dient zur Kommunikation zwischen Datenbanksystem und derAnwendung bzw. Benutzer
Unterteilung in unterschiedliche Zwecke
Datenabfrage und Manipulation:
Data Manipulation Language (DML)
Verwaltung der DB und Definition der Datenstruktren:
Data Definition Language (DDL)
Berchitigungssteuerung:
Data Control Language (DCL)
16 / 50
JDBCLiteratur
Abfragen
Abfragen sind SQL-Operationen die ein Ergebnis zuruckliefern(SELECT)
in Java werden Anfragen mit der Methode executeQuery()ausgefuhrt
Methode erwartet eine gultige SQL-Anweisung (muss derSyntax des verwendeten Datenbanksystems entsprechen)
liefert ein ResultSet-Objekt zuruck
das ReultSet reprasentiert einen Datenbank-Cursor
17 / 50
JDBCLiteratur
Freigabe von Ressourcen
belegte Ressourcen mussen wieder freigegeben werden
ResultSet, Statement und Connection verwenden großeDatenstrukturen (nicht auf garbage collector warten)
fur alle Klassen existiert eine close() Methode
nach dem Schließen ist das Objekt nicht mehr aktiv und kannnicht mehr verwendet werden
ausreichend das Connection-Objekt zu schließen da alleinnerhalb der Verbindung erzeugten Objekte mit geschlossenwerden
18 / 50
JDBCLiteratur
Verbindung beenden
eine Verbindung wird nach Gebrauch wieder gechlossen
sehr wichtig, deshalb sollte dies immer im finally-Blockgeschehen
da Verbindung beendet wird und nicht der DriverManagerfindet sich die Methode close() bem Connection-Objekt
try
{
con = DriverManager.getConnection (...);
}
catch (SQLException e)
{
}
finally
{
if (con != null)
try {con.close ();} catch (SQLException e)
}
19 / 50
JDBCLiteratur
SQL-Typen vs. Java-Typen
bei Anweisungen mussen oft Parameter gesetzt werden oderWerte abgefragt werden
Konvertierung zwischen Java-Typen und SQL-Typenerforderlich
Type-Mapping mit JDBC 1.0 eingefuhrt bildet Java-Typen aufSQL-Typen ab und umgekehrt
19 Typen fur die in java.sql.Types eine Konstante definiertist die den Typ reprasentiert
bei der Abfrage von ResultSet-Werten konnen automatischKonvertierungen vorgenommen werden (durchgetXXX()-Methoden)
20 / 50
JDBCLiteratur
Dynamisches vs. Vorbereitetes SQL
zwei Moglichkeiten zum Ausfuhren von Anweisungen
dynamishes SQL und vorbereitetes SQL
beide setzen einen String in der Anwendung zusammen
wird bei Ausfuhrung zum Server geschickt
Konstruktion kann zur Laufzeit durchgefuhrt werden
wenn Parameteranzahl variiert einfaches SQL
ansonsten vorbereitetes SQL (weniger Konvertierung, besserePerformance)
21 / 50
JDBCLiteratur
Dynamisches SQL
komplette Anweisung wird als String zusammengestellt
wird anschließend an DBS geschickt
Paramter die in der Anweisung benutzt werden mussen vonHand eingebaut werden
soll dieselbe Anweisung mit unterschiedlichen Parameternausgefuhrt werden muss String neu zusammengesetzt werden
Erzeugen eines Statement-Exemplares
Aufrufen der createStatement() Methode vomConnection-Objekt aus
alle Anfragen, DDL und DDM Operationen werden uberStatement-Objekt durchgefuhrt
22 / 50
JDBCLiteratur
Abfragen und Operationen
Abfragen werden mit der Methode executeQuery()durchgefuhrt
Methode erwartet eine gultige SELECT-Anweisung (muss derSyntax des verwendeten Datenbanksystems entsprechen)
liefert ein ResultSet-Objekt zuruck
executeUpdate() wird fur DDL- und DDM-Operationenverwendet
erwartet eine gultige INSERT, UPDATE, DELETE oderCREATE Anweisung
String wird erst bei Ausfuhrung dem Statement-Exemplarubergeben
mit einem Exemplar konnen versch. Typen von Anweisungenausgefuhrt werden
23 / 50
JDBCLiteratur
Beispiel
String s = "SELECT * FROM test";
String u = "UPDATE test SET wert = 2 WHERE name = 1";
Statement stmt = con.createStatement ();
...
ResultSet res = stmt.executeQuery(s);
...
res.close ();
stmt.executeUpdate(u);
...
stmt.close ();
24 / 50
JDBCLiteratur
Parameter
Parameter werden uber String-Operationen eingebaut
Syntax des verwendeten DBS muss beachtet werden
relativ einfach bei Zeichenketten und Zahlenwerten da Syntaxstandardisiert
schwieriger bei z.B. Datums-Typen
dynamische SQL-Anweisungen sind sehr allgemein definiert
eignen sich wenn die Anzahl der Parameter variieren kann z.B.Suchanfrage
25 / 50
JDBCLiteratur
Parameter
String kriterien [];
Connection con;
Statement stmt = con.createStatement ();
String s = "SELECT * FROM titel WHERE";
s += " titel LIKE ’"+kriterien [0]+"’";
for(int i = 1; i < kriterien.length; i++){
s += " AND titel LIKE ’"+kriterien[i]+"’";
}
26 / 50
JDBCLiteratur
Ergebnismengen
ResultSet reprasentiert eine Ergebnismenge
stellt in Java einen Datenbank-Cursor dar.
ist Ruckgabewert der Funktion executeQuery() ausStatement, PreparedStatement und CallableStatement
bietet Zugang zu Datensatzen die vom DB-Serverzuruckgeliefert werden (kann auch leer sein)
fuhrt internen Datensatzzeiger (kann sich vor dem ersten undhinter dem letzten Datensatz befinden)
27 / 50
JDBCLiteratur
Ergebnismengen
nach der Abfrage befindet sich das ReultSet vor dem erstenDatensatz
Vorrucken durch next()
next() liefert boolschen Wert zuruck (weitere Datensatzevorhanden?)
da Satzzeiger sich vor dem ersten Satz befindet muss initialnext() aufgerufen werden
Daten konnen mit getXXX() abgerufen werden
als Parameter Namen oder Position einer Spalte (Pos. beginntbei 1)
28 / 50
JDBCLiteratur
Typkonvertierung
in JDBC konnen bei der Abfrage von Werten automatischKonvertierungen durchgefuhrt werden
getLong(), getString(), getInt() ...
Connection con;
Statement stmt = con.createStatement ();
String s = "SELECT titel ,preis FROM titel";
ResultSet res = stmt.execute(s);
while(res.next ()) {
System.out.println("Titel"+res.getString("titel");
}
29 / 50
JDBCLiteratur
Metadaten
Informationen uber Tabellen und uber die Datenbank selbst
verschiedene Informationen uber eine DB konnen ausgelesenwerden
ist nutzlich wenn man allgemeine Abfragen hat und z.B. dieAnzahl der Spalten im Ergebnis nicht kennt
bei Tabellen: Anzahl Spalten, Spaltentyp, NULL erlaubt,Spaltenname ...
gesamte Datenbank: welche Tabellen, akt. Verbindungen, sindouter joins moglich ...
30 / 50
JDBCLiteratur
Metadaten von Tabellen
Klasse ResultSetMetaData
ResultSetMetaData meta = rs.getMetaData ();
getColumnCount() Anzahl der Spalten
getCatalogName(int column) Katalogname
getColumnTypeName(int column) Spaltentyp
getScale(int column) Genauigkeit der Spalte
isAutoincrement(int column) Autoincrement ?
isNullable(int column) darf NULL vorhanden sein?
31 / 50
JDBCLiteratur
Metadaten der Datenbank
Klasse DatabaseMetaData
DatabaseMetaData meta = con.getMetaData ();
getDatabaseProductName()
getMaxConnections()
getDriverVersion()
getTableTypes()
supportsOuterJoins()
...
32 / 50
JDBCLiteratur
Positionierung
seit JDBC 2.0 moglich sich in einer Ergebnismenge zuruck zubewegen
außerdem direkt eine Zeile anwahlbar
Konstanten aus dem ResultSet-Interface definierenPositionierbarkeit
beim Erzeugen des Statements wird Konstante ubergeben
FORWARD ONLY nur vorwarts
TYPE SCROLL INSENSITIVE vorwarts, ruckwarts, absolutbekommt Anderungen aus anderen Sitzung nicht mit
TYPE SCROLL SENSITIVE vorwarts, ruckwarts, absolutbekommt Anderungen aus anderen Sitzung mit
33 / 50
JDBCLiteratur
Positionierung
Methoden eines positionierbaren ResultSets
previous() zuruck
first() erster Datensatz
last() letzter Datensatz
beforeFirst() vor den ersten
afterLast() nach den letzten
absolute(int) springe zu Nummer Datensatz
relative(int) verandere aktuelle Position
34 / 50
JDBCLiteratur
Verandern von Datensatzen
seit JDBC 2.0 aktueller Datensatz veranderbar uberupdateXXX() mit konkretem Datentyp
CONCUR READ ONLY nicht anderbar
CONCUR UPDATETABLE anderbar
1. Statement Exemplar erzeugen
2. Anfrage ausfuhren ResultSet positionieren
3. Anderung uber ResultSet-Methoden updateRow(),deleteRow(), insertRow()
35 / 50
JDBCLiteratur
Verandern von Datensatzen
Connection con;
Statement stmt = con.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE ,
ResultSet.CONCUR_UPDATEABLE );
String s = "SELECT tit_id , preis
FROM titel WHERE tit_id = 2";
ResultSet res = stmt.executeQuery(sql);
rs.next ();
rs.updateFloat (2 ,50);
rs.updateRow ();
...
36 / 50
JDBCLiteratur
Große der Ergebnismenge
entweder mit zwei Abfragen oder mit Positionierung vonJDBC 2.0
Result res = stmt.executeQuery(
"SELECT count (*) FROM titel");
res.next ();
long length = res.getLong (1);
res.close ();
// eigentliche Anfrage
Statement stmt = con.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE ,
ResultSet.CONCUR_READ_ONLY );
Result res = stmt.executeQuery(
"SELECT preis , name FROM titel");
res.last ();
long length = res.getRow ();
res.first ();
// Zugriff auf Daten
37 / 50
JDBCLiteratur
Vorbereitetes SQL
Platzhalter fur Parameter in Anweisungen
werden bei Ausfuhrung mit Werten belegt dadurchAnweisungen mehrfach verwendbar
Parameter werden durch ? definiert
Erzeugen eines PreparedStatements mitprepareStatement()-Methode
SQL-Anweisung + Parameter Definition werden ubergeben
mit setXXX()-Methoden werden Parameter mit Wertenbelegt (XXX fur Datentyp)
38 / 50
JDBCLiteratur
Vorbereitetes SQL
beim Erzeugen wird SQL-String an DBS geschickt, kompiliertund zwischengespeichert mit Lucken fur Parameter
erst beim Aufruf der setXXX()-Methoden gesetzt
setXXX() kann Parameter immer wieder neu setzen
die initial kompilierte Anweisung wird wiederverwendet nurmit neuen Parametern
bessere Performance
39 / 50
JDBCLiteratur
Parameter setzen
setXXX() erwartet Index des Parameters und Wert
bei mehrfachem Ausfuhren mussen nicht alle Werte neubelegt werden
Wert bleibt solange gultig bis er durch neuen ersetzt wird
Loschen der Parameter mit clearParameters()
NULL-Werte sind setzbar durch setNull() oder NULL
40 / 50
JDBCLiteratur
Parameter setzen
long titId;
long words [];
String sql = "INSERT INTO stichworte_titel
VALUES (?,?)";
PrepareStatement stmt = con.prepareStatement(sql);
stmt.setLong(2, titId );
for(int i=0; words.length; i++) {
stmt.setLong(1, words[i]);
stmt.executeUpdate ();
}
41 / 50
JDBCLiteratur
Stored Procedures
CallableStatement in JDBC abgeleitet vonPreparedStatement
prepareCall() erzeugt CallableStatment
Ruckgabewerte mussen vor Ausfuhrung definiert werdenregisterOutParameter()
Parameter setzen setXXX()
Aufrufen von executeUpdate()
{ ? = call funktion(?, ?) }
{ call funktion(?, ?)}
42 / 50
JDBCLiteratur
Stored Procedures
Stored Functions besitzt einen Ruckgabewert
Stored Procedures und Functions konnen OUT oder IN OUTParameter definieren
String isbn;
int rank;
String sql = "{ ? = call ranking (?) }";
CallableStatement call = con.prepareCall(sql);
call.setString (2, isbn);
call.registerOutParameter (1, Types.NUMERIC );
call.executeUpdate ();
rank = call.getInt (1);
43 / 50
JDBCLiteratur
Large Objects
große Daten in Datenbanken
zwei Typen BLOBs und CLOBs
in JDBC Schnittstelle zum Zugriff auf Large Objects
werden uber Streams vom DBS gelesen, bzw. geschrieben
Schreiben vom Large Objects nur mit PreparedStatementbzw. CallableStatement-Exemplaren
44 / 50
JDBCLiteratur
Zugriff auf BLOB und CLOB
Zugriff uber getBlob() und getClob()
Setzen uber setBinaryStream() da es keinen eigenenKonstruktor gibt
NEU seit Java 6: createBlob(), und CreateClob()
PreparedStatement stmt = con.prepareStatement(
"INSERT INTO MyTable column VALUES (?)" );
File file = new File( "myImage.jpg" );
InputStream in = new FileInputStream( file );
stmt.setBinaryStream( 1, in, (int) file.length ());
stmt.executeUpdate ();
45 / 50
JDBCLiteratur
Transaktionen
sind durch folgende Eigenschaften charakterisiert
Atomic (atomar): zu einer Transaktion konnen mehrereprimitive Anderungen gehoren von denen entweder alle oderkeine augefuhrt wird
Consistent (kosistent): uberfuhren Datenbank von einemkonsistenten Zustand in einen anderen konsitenten Zustand
Isolated (isoliert): Einzelschritte beliben fur andere Sitzungenverborgen
Durable (dauerhaft): Anderungen werden dauerhaftgespeichert
46 / 50
JDBCLiteratur
Transaktionen
nach dem Offnen einer Verbindung wird automatisch neueTransaktion gestartet
Auto-Commit-Modus
nach jeder Ausfuhrung wird die Anderung gespeichert
nach der Ausfuhrung neue Transaktion
Commit-Modus kann uber die Methode setAutoCommit()beeinflusst werden
getAutoCommit() fragt Zustand ab
47 / 50
JDBCLiteratur
Transaktionen
liefert getAutoCommit() false muss man Transaktionenselber steuerncommit() beendet Transaktion und speichert Anderungenrollback() Anderungen die seit dem letztn commit()gemacht wurden werden verworfen
Connection con =
DriverManager.getConnection(url , user , password );
con.setAutoCommit(false);
Statement stmt = con.createStatement ();
...
try {
stmt.executeUpdate(up1);
stmt.executeUpdate(up2);
con.commit ();
} catch(SQLException e) {
con.rollback ();
}
48 / 50
JDBCLiteratur
Ubungsaufgaben
embedded Datenbank da einfach aufzusetzen
100% Java nur ein Jar und DB als 3 Dateien
hier H2 (http://www.h2database.com/)
Treibername: org.h2.Driver
Url-Syntax: “jdbc:h2:/tmp/testdb “ wobei “/tmp/testdb“ derDateiname der DB ist
Username ist “sa“, Passwort leer
Datenbank wird automatisch erzeugt
Webinterface auf dem lokalen Rechner
h2/bin/h2.jar muss zum Classpath hinzugefugt werden
49 / 50