Kapitel 10 JDBC und SQLJ Prof. Dr. Wolfgang Weber Vorlesung Datenbanken 1 JDBC und SQLJ • Bisher: Einbettung von SQL (statisch bzw. dynamisch) in C, C++, COBOL, ADA … (embedded SQL) bzw. prozedurale Erweiterungen für SQL in Oracle (PL/SQL) • Was ist mit Zugriff auf SQL-Datenbanken aus Java? • JDBC – – – • 1996: JDBC-Spezifikation von Sun vorgestellt Java-API für Zugriff auf SQL-Datenbanken Unterstützt dynamisches SQL -> keine Typprüfung während Übersetzung SQLJ (vgl. embedded SQL) – – – – 1997 vorgeschlagen von IBM, Oracle, Sybase, Informix und Sun Seit Ende 1998 ANSI-Standard Unterstützt statisches SQL -> Typprüfung während Übersetzung in bestimmten Umfang: auch dynamische SQL-Anweisungen Prof. Dr. Wolfgang Weber Vorlesung Datenbanken 2 JDBC – Architektur Architektur – siehe Tafel Java Klassen und Interfaces im Paket java.sql • java.sql.DriverManager Laden der Treiber und Aufbau der Verbindung zur Datenbank • java.sql.Connection ein Connection-Objekt repräsentiert eine Datenbankverbindung • java.sql.Statement Objekt für die Ausführung von SQL-Anweisungen • java.sql.ResultSet Objekt für die Repräsentation der Ergebnis-Relation der Abfrage Prof. Dr. Wolfgang Weber Vorlesung Datenbanken 3 JDBC – Anfrageausführung // Aufbau der Verbindung Connection con = DriverManager.getConnection(url, benutzer, passwort); // Aufbau und Ausführung der Anfrage String retQuery = “select Prod-Nr, Produktart from Toepferprodukt“; Statement stmt = con.createStatement (); ResultSet rs = stmt.executeQuery ( retQuery ); Für Retrieval-Operationen (select): stmt.executeQuery Für Einfüge- (insert), Update- (update), Lösch- (delete) und DDL-Operationen (create table, drop table): stmt.executeUpdate ... String insQuery = “insert into Toepferprodukt values (50071, ‘Vase‘)“; Statement stmt = con.createStatement (); int numberRows = stmt.executeUpdate ( insQuery ); Prof. Dr. Wolfgang Weber Vorlesung Datenbanken 4 JDBC – Auswertung des Anfrageergebnis Auswertung des Result-Set: • Navigation auf der Ergebnismenge mit Referenz (~Cursor in PL/SQL) • Zugriff auf Spalten des ResultSet mit get<type> -Methoden ... String retQuery = “select Prod-Nr, Produktart from Toepferprodukt“; Statement stmt = con.createStatement (); ResultSet rs = stmt.executeQuery ( retQuery ); //entspricht //declare cursor c is select … ; in PL/SQL System.out.println(“Produkt-Nr Produktart“); Cursor rs steht am Anfang try { VOR dem ersten Tupel, while (rs.next ()) nach rs.next auf 1. Tupel { int i = rs.getInt(1); Spalten sind von 1 String s = rs.getString(2); bis n nummeriert System.out.println (i + “ “ + s); } } catch (SQLException exc) { // Fehlerbehandlung System.out.println(“SQL-Fehler: “ + exc); } Prof. Dr. Wolfgang Weber Vorlesung Datenbanken 5 JDBC – Anfragen mit Parameter Statt Statement wird das Objekt PreparedStatement der Klasse Connection verwendet, wenn Parameter erst zur Laufzeit ermittelt werden können: String insQuery = “insert into Toepferprodukt values (?, ?)“; PreparedStatement stmt = con.prepareStatement (insQuery); // Setzen der Werte stmt.setInt ( 1, 50071) stmt.setString ( 2, “Vase“); int numberRows = stmt.executeUpdate ( insQuery ); • Weitere Möglichkeiten in JDBC – CallableStatement für den Aufruf von Stored Procedures – Pooling von Connection-Objekten, verteilte Transaktionen, verbessertes Cursor-Scrolling etc. in JDBC 2 – Weitere Datentypen, Unterstützung von Savepoints in Transaktionen etc. in JDBC 3 – … Prof. Dr. Wolfgang Weber Vorlesung Datenbanken 6 SQLJ • • • Direkte Einbettung von SQL-Anweisungen in Java Code SQLJ-Anweisungen werden mittels Pre-Compiler in Java-Code übersetzt Vgl. embedded SQL • Eingebetete SQL-Anweisungen werden durch #sql gekennzeichnet: #sql { <SQL-Anweisungen> } • Ergebnistupel können mit einem Iterator durchlaufen werden (Iterator entspricht Cursor in PL/SQL) • Host-Variablen werden durch Doppelpunkt (:name) gekennzeichnet ... try{ #sql iterator PrdItr (int ProdNr, String ProdArt); #sql PrdItr = { select Prod-Nr, Produktart from Toepferprodukt }; while (PrdItr.next ()) { System.out.println(PrdItr.ProdNr()+“ “+PrdItr.ProdArt())} ... } ... Prof. Dr. Wolfgang Weber Vorlesung Datenbanken 7