Praktikum Datenbanksysteme Herbstsemester 2012 Dr. Andreas Geppert Platform Architecture Technology Infrastructure Services Credit Suisse geppert@acm.org Herbstsemester 2012 Slide 1
Themenübersicht konzeptueller Entwurf logischer Entwurf Konsistenzbedingungen Datenmanipulation Anfragen Transaktionen Sichten Stored Procedures und benutzerdefinierte Funktionen Trigger Datenbankanwendungen mit Java (JDBC, SQLJ) evtl. Web-Anwendungen mit JEE (JDBC, SQLJ) 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 Herbstsemester 2012 Slide 3
JDBC API API definiert Schnittstellen Datenbankverbindungen (Connection) Befehle (Statement) Ergebnisse (ResultSet) Metadaten (versch. Formen) Treiber (Driver) implementiert API Treiber-Manager (DriverManager) registriert Treiber kann Verbindungsanfragen weiterleiten Java-App. JDBC-API JDBC-Treiber Herbstsemester 2012 Slide 4
JDBC Treiber Java App Java App Java App Type 1 Driver (JDBC/ODBC-Bridge) Type 2 Driver Type 3 Driver Java App ODBC-Driver Native Library/Client Proprietary protocol Independent protocol JDBC-server Type 4 Driver DBMS-specific protocol 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 Herbstsemester 2012 Slide 6
JDBC Typische Verarbeitungssequenz DriverManager getconnection() Connection createstatement(), preparestatement() Statement execute() executequery() ResultSet 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 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, 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 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! 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 Herbstsemester 2012 Slide 12
SQLJ Program.sqlj sqlj Exemplar DB Program.java Program_SJProfile0.ser javac Program.class Program_SJProfileN.ser 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 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 }; 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()) {... } 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(); 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()); Herbstsemester 2012 Slide 18