No Slide Title

Werbung
Praktikum Datenbanksysteme
Herbstsemester 2012
Dr. Andreas Geppert
Platform Architecture
Technology Infrastructure Services
Credit Suisse
[email protected]
© Andreas Geppert
Herbstsemester 2012 Slide 1
Themenübersicht
■
■
■
■
■
■
■
■
■
■
■
konzeptueller Entwurf
logischer Entwurf
Konsistenzbedingungen
Datenmanipulation
Anfragen
Transaktionen
Sichten
Stored Procedures und benutzerdefinierte Funktionen
Trigger
Datenbankanwendungen m it Java (JDBC, SQLJ)
evtl. Web-Anwendungen mit JEE (JDBC, SQLJ)
© Andreas Geppert
Herbstsemester 2012 Slide 2
JDBC
Motivation
■ Datenbankanbindung für Java-Anwendungen
■ Probleme:
– unterschiedliche Typsysteme (Java vs. SQL)
– DBMS-Spezifika (SQL-Dialekte)
– unterschiedliche Protokolle (technisch, Netzwerk)
■ JDBC
– definiert Abbildung der Typsysteme
– Schnittstellen für Datenbankanbindung (API)
– Flexibilität bzgl. Protokoll
© Andreas Geppert
Herbstsemester 2012 Slide 3
JDBC
API
■ API definiert Schnittstellen
– Datenbankverbindungen (Connection)
Java-App.
– Befehle (Statement)
– Ergebnisse (ResultSet)
– Metadaten (versch. Formen)
■ Treiber (Driver)
– implementiert API
JDBC-API
JDBC-Treiber
■ Treiber-Manager (DriverManager)
– registriert Treiber
– kann Verbindungsanfragen weiterleiten
© Andreas Geppert
Herbstsemester 2012 Slide 4
JDBC
Treiber
Java App
Java App
Type 1 Driver
(JDBC/ODBC-Bridge)
Java App
Java App
Type 2 Driver
Type 3 Driver
Native Library/Client
ODBC-Driver
Independent protocol
Type 4 Driver
JDBC-server
Proprietary protocol
DBMS-specific protocol
© Andreas Geppert
Herbstsemester 2012 Slide 5
JDBC
Treiber (2)
■ Treiberklassen müssen geladen sein
– mittels Properties-File
– durch Application-Server
– explizit
// load driver
Class.forName("org.postgresql.Driver "); // Typ 4
Class.forName("COM.ibm.db2.jcc.DB2Driver"); // Typ 4
Class.forName("COM.ibm.db2.jdbc.net.DB2Driver"); // Typ 3
Class.forName("COM.ibm.db2.jdbc.app.DB2Driver"); // Typ 2
© Andreas Geppert
Herbstsemester 2012 Slide 6
JDBC
Typische Verarbeitungssequenz
DriverManager
getConnection()
Connection
createStatement(), prepareStatement()
Statement
execute()
executeQuery()
ResultSet
© Andreas Geppert
Herbstsemester 2012 Slide 7
JDBC
Datenbankverbindungen
■
■
■
■
Grundlage des Datenbankzugriffs über JDBC
erhältlich vom Treiber-Manager
Treiber-Manager ermittelt geeigneten Treiber
basierend auf Datenbank-URL
–
–
–
–
–
jdbc:postgresql://localhost:5432/cashdb
jdbc:db2:mydb
jdbc:db2://myhost.mydomain.com:6789/mydb
jdbc:oracle:oci:@
jdbc:oracle:thin:@myhost:1521:myorainst
■ alternativ DB-Verbindung durch Datenquelle (DataSource)
– zusätzlich Verwaltung von Connection Pools
© Andreas Geppert
Herbstsemester 2012 Slide 8
JDBC
Statements
■ “einfache” Statements
–
–
–
–
erzeugt mit Connection.createStatement()
SQL-Befehle als Zeichenkette
Konvertierung in SQL-Formate durch Appl.
execute, executeQuery, executeUpdate, …
■ Prepared Statements
–
–
–
–
parametrisiert (? als Platzhalter)
erzeugt mit Connection.prepareStatement(SQL-Befehl)
mit unterschiedlichen aktuellen Params mehrfach ausführbar
Methoden zum Setzen von Parametern
 setInt, setString, etc.
– execute, executeQuery, executeUpdate, …
© Andreas Geppert
Herbstsemester 2012 Slide 9
JDBC
Statements (cont.) & Ergebnisse
■ Callable Statements
– für Prozeduraufrufe
■ Ergebnismengen (ResultSet)
– Ergebnis von Anfragen
 vgl. mit Cursors
– Verarbeitung durch Iteration
– Spezialfall: mehrere Ergebnismengen
■ Zahl der geänderten Tupel
– im Fall von Aenderungen
© Andreas Geppert
Herbstsemester 2012 Slide 10
JDBC
Standardisierung und Implementierung
■ JDBC:
– standardisiert als Teil von J2EE
– Treiber erhältlich für viele DBMS
■ JDBC 2
–
–
–
–
erweitert JDBC 1
flexiblere Verarbeitung von Ergebnismengen
Aenderung von Ergebnissen während Iteration
objektrelationale Konzepte
 Referenztypen
 strukturierte Typen (UDTs)
 Arrays
– unterschiedlicher Implementierungsstand je nach DBMS!
© Andreas Geppert
Herbstsemester 2012 Slide 11
SQLJ
■ statische Anbindung für Java an relationale DBS
■ statisch:
– Ueberprüfung von Anfragen / DB-Befehlen zur Kompilationszeit
– Anfragen / DB-Befehlen müssen im Vorhinein bekannt sein
– modolo Parametrisierung
■ mehr Garantien bzgl. Korrektheit
■ bessere Performance möglich
© Andreas Geppert
Herbstsemester 2012 Slide 12
SQLJ
sqlj
Exemplar
DB
Program.sqlj
Program.java
Program_SJProfile0.ser
javac
Program_SJProfileN.ser
Program.class
© Andreas Geppert
Herbstsemester 2012 Slide 13
SQLJ: Präprozessor
■ Präprozessor
– überprüft Syntax
 Syntaxfehler werden erkannt und rapportiert
 “offline checking”
– generiert reinen Java-Code
■ optional:
– Ueberprüfung der Semantik von Anfragen/Befehlen
 "online checking"
 basierend auf Beispiel-DB (“exemplar database”)
– Typkorrektheit etc.
– Customizing für DBMS
© Andreas Geppert
Herbstsemester 2012 Slide 14
SQLJ: Syntax
■ SQL-Anweisungen im Java-Code durch #sql markiert
■ Bsp: #sql { select count(*) into :cnt from vehicle };
■ Context:
– Abstraktion von (JDBC-) Connections
– erlaubt mehrere simultane Verbindungen
■ Bsp:
#sql Context CashContext; ...
CashContext ctxt = new CashContext(...);
#sql [ctxt] { select count(*) into :cnt from vehicle };
© Andreas Geppert
Herbstsemester 2012 Slide 15
SQLJ: Iteratoren
■ Verarbeitung von Ergebnismengen: in SQLJ mit Iteratoren
■ "benannte" Iteratoren: definieren Attributname/Typ
■ Generator erzeugt Zugriffsmethode
■ Zugriff auf Ergebnisattribute mit generierten Methoden
#sql iterator MemberIterator(int
memberNr, String name);
...
MemberIterator mit = null;
#sql [ctxt] mit = { select m.memberNr, m.oid->getMemberName as name ...};
while (mit.next()) { ... }
© Andreas Geppert
Herbstsemester 2012 Slide 16
SQLJ: Iteratoren
#sql iterator MemberIterator(int
memberNr, String name);
...
MemberIterator mit = null;
#sql [ctxt] mit = { select m.memberNr, m.oid->getMemberName as name ...};
while (mit.next()) {
System.out.println("member " + mit.memberNr() + " heisst " + mit.name());
}
mit.close();
© Andreas Geppert
Herbstsemester 2012 Slide 17
SQLJ: Parameter
■ Angabe von Parametern möglich
int nr = 4711;
#sql [ctxt] { delete from member where m.memberNr = :nr };
■ Aenderungen: Anzahl geänderter Tupel
ExecutionContext ectxt = ctxt.getExecutionContext();
#sql [ctxt, ectxt] { delete from member where m.memberNr = :nr };
System.out.println("Anzahl geloeschter Tupel: " + ectxt.getUpdateCount());
© Andreas Geppert
Herbstsemester 2012 Slide 18
Herunterladen