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