Kapitel 10 JDBC und SQLJ 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 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 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 ); 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 ); try { while (rs.next ()) { int i = rs.getint(1); String s = rs.getstring(2); System.out.println (i + + s); } } catch (SQLException exc) { // Fehlerbehandlung System.out.println( SQL-Fehler: + exc); } Cursor rs steht am Anfang VOR dem ersten Tupel, nach rs.next auf 1. Tupel Spalten sind von 1 bis n nummeriert 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 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())}... }... 7