Java Database Connectivity-API (JDBC) Motivation Design Grundlagen Typen Metadaten Transaktionen Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 1 Motivation Problem: Zugriff auf ein DBMS ist Herstellerabhängig Anwendung Anwendung Anwendung MySQL API MySQL DB2 API DB2 Oracle API Pratikum SWE 2 Oracle © M. Löberbauer, T. Kotzmann, H. Prähofer 2 Motivation Lösung: Zwischenschicht MySQL API Anwendung JDBC API JDBC MySQL DB2 API DB2 Oracle API Oracle JDBC Treiber Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 3 Design Entwicklung seit: 1995 Erster Ansatz: Java erweitern Zweiter Anzatz: Treiber der Datenbankhersteller Vorbild: ODBC Unterschiede: • ODBC wenige Befehle, viele Optionen • JDBC viele einfache Methoden • ODBC nutzt -Zeiger • Java kennt keine Zeiger Flexibilität: JDBC erlaubt beliebige Zeichenfolgen • Anpassung an Datenbank möglich. - Optimierung - Bindung Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 4 Design Java Anwendung JDBC-Treibermanager JDBC/ODBC -Brücke JDBCTreiber ODBCTreiber Datenbank Datenbank Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 5 Treiber Typ 1: JDBC/ODBC-Brücke • • • • • • ODBC ist sehr weit verbreitet Leistung Wartung Testen, Experimentieren kein JDBC Treiber verfügbar Windows Plattformen JDBCAnwendung O D B C ODBC DB Client Server Typ 2: Partial Java Driver • • • • konvertiert JDBC Aufruf in DB abhängigen API Aufruf schnell, weil API Aufruf kompiliert ist A DB + OS abhängig JDBCP Nutzer braucht plattformabhängige API Anw. I Client Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer DB Server 6 Treiber Typ 3: Reiner Java Treiber zu Middleware • • • • Keine plattformabhängigen Treiber am Client DB unabhängig JDBCFlexibel, mehrere DB möglich Anw. DB abhängiger Code in Middleware Client M W DB Server Server Typ 4: Reiner Java Treiber direkt zur DB • • • • JDBC in DB spezifische Netzwerkaufrufe verpackt Schnell Keine plattformabhängigen Treiber am Client Client braucht für verschiedene DB verschiedene Treiber Pratikum SWE 2 JDBCAnw. DB Client Server © M. Löberbauer, T. Kotzmann, H. Prähofer 7 Treiberinstallation Download • http://servlet.java.sun.com/products/jdbc/drivers • Datenbankhersteller Installation • Eintragen in den Klassenpfad Registrieren • Bei dem Programmstart durch Parameter: - java –Djdbc.drivers=com.mysql.jdbc.Driver <Programm> • Setzen der Systemeigenschaft "jdbc.drivers": - ! " $ ' ! ( )! # $% ! & * Pratikum SWE 2 ! © M. Löberbauer, T. Kotzmann, H. Prähofer 8 Verbindungsaufbau Verbindungsaufbau erfolgt mit • Url zur Datenbank • Benutername, Passwort Datenbank Url • jdbc:<Datenbanktreiber>:<treiberspezifische Angaben> • MySql: - jdbc:mysql://<host>:<port>/< Datenbankname> • HSQLDB: - jdbc:hsqldb:<Dateipfad> Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 9 Grundlagen: DriverManager DriverManager • Verwaltet registrierte Treiber • Aufbau von Verbindungen + ' + , + , + ! * - Liefert eine Connection zu der gegebenen url wenn ein passender Treiber registriert ist. -. / + ' ! ( -. 0 ( ' # .- )! ! 2 ! 1 3! !+ Pratikum SWE 2 + * , + .' ! , , © M. Löberbauer, T. Kotzmann, H. Prähofer ! 10 Grundlagen: Connection Connection: Verwaltet die Verbindung (Session) zu einer Datenbank. - Schließen der Verbindung - Bestätigen alle bisher vorgenommenen Änderungen, standard ist auto-commit ! ! ! - Erzeugt ein Statement mit dem SQL-Statements an die Datenbank abgegeben werden können. ! ! 4 , ! 5 ! 2 ! ! ) 6/# ! ! )#7 ! 80956 ! : ! : + - Erzeugt Statements welche von der Datenbank vorkompiliert werden können. ! ! 2 ! 4 ! ! , 5 ! ! ) 6/# )#7 80956 :; : ! Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 11 Grundlagen: Statement Statement: / , 4 , <, + - Ausführen einer SQL Abfrage (SELECT) 4 , 5 ! + - Ausführen eines Updates (UPDATE, INSERT, DELETE, CREATE). - Rückgabewert zeigt die Anzahl der betroffenen Zeilen. ! 4 , + - Ausführen einer beliebigen SQL Anweisung. - Rückgabewert Zeigt an ob eine Ergebnismenge geliefert wurde. + 5 ! ' , - Anzahl der von der letzten Anweisung betroffenen Zeilen oder -1 wenn die Anweisung keinen Zähler hatte. / , + / , - Ergebnismenge der letzten Abfrage oder , keine Ergebnismenge hatte. Pratikum SWE 2 wenn wenn die Anweisung © M. Löberbauer, T. Kotzmann, H. Prähofer 12 Grundlagen: PreparedStatement PreparedStatement: Absetzen von vorkompilierten Statements. =# > =# > 4 - Setzen des Parameters an der Stelle n (1 .. m). ! ! ! - Löschen aller Parameterwerte. / , 4 , <, - Ausführen der vorkompilierten SQL Abfrage (SELECT) 4 , 5 ! - Ausführen des vorkompilierten Updates (UPDATE, INSERT, DELETE, CREATE). - Rückgabewert zeigt die Anzahl der betroffenen Zeilen. ! ! 2 ! ! 4 ! ! 4 ! , , ! + @ 5 ! + @ 5 ! ! ! ! ; ) 6/# )#7 80956 ? A Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 13 Grundlagen: Callable Statement CallableStatement: Ausfüren von Datenbankprozeduren (SQL stored procedures) über spezielle SQL strings: • • • • Parameterlose Prozedur: B ! , C ! D Prozedur: B ! , C ! E ? ? FD Funktion: B? 2 ! , C ! E ? ? FD Das setzen der Parameter erfolgt analog zu den PreparedStatements Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 14 Grundlagen: ResultSet ResultSet: Ermöglicht das zeilenweise Abarbeiten der Ergebnistabelle. ! 4 - Anspringen der nächsten Zeile, begonnen wird vor der ersten Zeile. - true solange noch eine gültige Zeile erreicht wurde. =# =# + + ( ' > + =# > > + =# > ( ' , ! + + + G 2> HI + )! 2> 3!4 , ) 2> @ Pratikum SWE 2 ! ! )! )! 4 Nr 1 2 ... Name Max Kurt ... © M. Löberbauer, T. Kotzmann, H. Prähofer Age 25 27 ... 15 Grundlagen: ResultSet Fortsetzung ! ( - Erste Zeile im ResultSet. - true wenn eine gültige Zeile erreicht wurde. ( J - Vor die erste Zeile im ResultSet. ! - Letzte Zeile im ResultSet. - true wenn eine gültige Zeile erreicht wurde. !( 9! - Nach letzter Zeile im ResultSet. ! ! , * - Eine Zeile anspringen row > 0 ... von oben gezählt (1 erste Zeile, 2 zweite Zeile, ...) row < 0 ... von unten gezählt (-1 letzte Zeile, -2 vorletzte Zeile, ...) - true wenn eine gültige Zeile erreicht wurde. + / * - Nummer der aktuellen Zeile Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 16 Grundlagen: Beispiel ResultSet Wie viele Zeilen hat ein ResultSet? ' ! / , ! , *0 , *0 , -- 3 * 2 2 ! 4 ! ! , <, 696'# , ! , 2 ( / , + / * J , , ! 4 B D Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 17 Typen Standard-Typemapping zwischen SQL und JAVA SQL Type Java Type CHAR, VARCHAR, LONGVARCHAR String NUMERIC, DECIMAL java.math.BigDecimal BIT boolean TINYINT byte SMALLINT short INTEGER int BIGINT long REAL float FLOAT, DOUBLE double BINARY, VARBINARY, LONGVARBINARY byte[] DATE java.sql.Date TIME java.sql.Time TIMESTAMP java.sql.Timestamp Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 18 Metadaten Beschreibung der Struktur der Datenbank und deren Tabellen DatabaseMetaData: =' / , > + 3 + #! + / ! , + ! ! + + ! +EF + + ! ! ! ' , ! + + ! ! + + ! , - catalog: Name des Katalogs Tabellen ohne Katalog, , Katalognamen nicht brücksichtigen - scheme: Schemaname Tabellen ohne Schema, , nicht berücksichtigen - table: Tabellenname , nicht berücksichtigen - column: Spaltenname , nicht berücksichtigen - types: Typische namen: "TABLE", "VIEW", "SYSTEM TABLE", "GLOBAL TEMPORARY", "LOCAL TEMPORARY", "ALIAS", "SYNONYM" Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 19 Metadaten ResultSetMetaData: =/ , + ' > + 3 , ' , Nr 1 2 ... ! ! ! - Anzahl der Spalten im ResultSet. + + + ' + + + + + + + + + ' ' ' ' #! , , , , ' , )! , # ' , # #! )! Name Title ... Max Mag. ... Kurt DI ... ... ... , , )! ' , 2> G )! @ 2> ) # G 2> K # )! G 2> )! H 2> , Pratikum SWE 2 , , 696'# ) 0+ J7/3 , Nr 1 2 ... )! Name Age Max 25 Kurt 27 ... ... © M. Löberbauer, T. Kotzmann, H. Prähofer 20 Age 25 27 ... Transaktionen Auto Commit: Jede Anweisung ist eine abgeschlossene Transaktion. • Abfragen: $ =' > + 0, ' > 0, ' • Setzen: $ =' Abschliessen einer Transaktion: =' > Rücksetzen im Fehlerfall (z.B.: SQLException): =' > ! 1 ' B 0, ! ! ! ! D ! 4 4 4 ' ! , 5 , 5 , 5 (! 2 ! ! ! <964 Pratikum SWE 2 ! ) 6/# ) 6/# 5 0#6 B ! ! 1 D © M. Löberbauer, T. Kotzmann, H. Prähofer 21 Zusammenfassung Datenbankunabhängigkeit • Zwischenschicht • Treiberschnittstelle (mind. SQL 92) - 4 Treiberarten: JDBC -> ODBC Teilweise Java Nur Java zu einer Middleware Nur Java zur Datenbank • Einfachere Programmentwicklung Beliebige SQL-Kommandos absetzbar • Optimierung / Datenbankabhängigkeit Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 22