50
JDBC Literatur Ausgew¨ ahlte Implementierungsprobleme Rebecca Tiarks 22. Januar 2009 1 / 50

Rebecca Tiarks - informatik.uni-bremen.de€¦ · alle Anfragen, DDL und DDM Operationen werden ¨uber Statement-Objekt durchgef¨uhrt 22/50. JDBC Literatur Abfragen und Operationen

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

JDBCLiteratur

Ausgewahlte Implementierungsprobleme

Rebecca Tiarks

22. Januar 2009

1 / 50

JDBCLiteratur

Inhaltsverzeichnis

1 JDBC

2 / 50

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

JDBCLiteratur

Cay S Horstmann and Gary Cornell. Core Java. Revised andUpdated for Java SE 6; 8th ed. Prentice-Hall, Upper SaddleRiver, NJ, 2008.

Christian Ullenboom. Java ist auch eine Insel. Galileo Computing,7 edition, 2008. ISBN 978-3-8362-1146-8.

50 / 50