1 Java zum Zugriff auf Datenbanken SQLJ Mahboubeh Pakdaman 15.01.2001 2 Ablauf / Was ist SQLJ? / Warum SQLJ? / Brauchen wir noch JDBC? / Beispiele. / Drei Teile der SQLJ-Spizifikation und die Anwendung dieser Konzepte. / Fazit. 3 Was ist SQLJ? / SQLJ ist eine neue offene Standard Application Programming Interface(API) für die statische Einbettung in Java Programmen. / SQLJ ist eine Produktion von Oracle , IBM, Sybase, Tandom, Javasoft , Microsoft , XDB und Informix. 4 Warum SQLJ? / SQLJ vereinfacht Schreiben , Verwaltung und Debbugging Java Datenbase Applications. / SQLJ basiert auf dem Einbettungsprinzip ,d.h. SQL Anweisungen sind zur Übersetzungszeit definiert: 1. Weniger Fehlerträchtig. 2. Mächtiger und mehr vertrauenbar um Codes zu schreiben. 3. Java-Quelltext sind kompakt und besser lesbar. 5 Brauchen wir noch JDBC? / JA. statische SQL =========> SQLJ dynamische SQL =========> JDBC / SQLJ und JDBC sind interoperabil : Man kann die SQLJ und JDBC Anweisungen in ein SQLJ Application benutzen. 6 Beispiele / JDBC String name; int id=37115; float salary=2000; PreparedStatement pstm=con.preparedStatement( “SELECT ename FROM emp WHERE empno=? And sal >? ”) ; pstmt.setInt(1,id); pstmt.setFloat(2,salary); ResultSet rs=psmt.executeQuary(); while(rs.next()) { name=rs.getString(1); System.out.println(“Name is :”+name); } rs.close(); psmt.close(); / SQLJ String name; int id=37115; float salary=2000; #sql {SELECT ename INTO :name FROM emp WHERE empno=:id AND sal> :salary}; System.out.println(“Name is :”+name); 7 Prinzip von SQLJ Data.sqlj Data.java SQLJ Translator Data.class Java Compiler 8 Drei Teile der SQLJ-Spezifikation und die Anwendung dieser Konzepte / Part 0 : SQLJ Embedded -Die wichtigen SQLJ-Komponenten, -Sqlj-klauseln und HostVariablen/Ausdrücken -Itratoren -Kontexte -Der Sqlj-Translator und Profile / Part 1 : SQLJ gesteuerte Prozeduren/Funktionen - Benutzen Java static Funktionen als gesteuerte Prozeduren /Funktionen. / Part 2 : SQLJ Datentypen - Nutzung von Java Klassen zur Implementierung von SQL Datentypen. 9 Part 0-Die wichtigen SQLJKomponenten / Der Translator übersetzt ein gegebenes SQLJProgramm in ein entsprechendes Java-Programm. / Das Laufzeitsystem ist im Java-Package sqlj.runtime definiert und besteht aus Menge von Java-Klassen die den Datenbankzugriff realisieren. / Ein Customizer ist ein Komponent, das das erzeugte Profil an ein DBMS anpasst. SQLJ-Klauseln 10 / Sqlj-Klauseln bilden den Mechanismus zur Einbettung von Sql in Java-Code. Es gibt zwei Formen: 1.Deklarationen von Java-Klassen für Iteratoren und Kontexte sowie 2.Ausführbare Sql-Anweisungen: # sql { SQL-Operationen} ; - Select Anweisungen und Ausdrücken. - Anweisungen zum Auslesen von Daten (select..into,fetch). - Die DML-Operationen(insert, update und delete). - DDL-Operationen(create table). - Aufruf von gespeicherte Prozeduren und Funktionen. 11 Host-Variablen/-Ausdrücken / Ein Host-Ausdruck ist ein Ausdruck in Java , der in einer SQL-Klausel zum Datenaustausch eingesetzt wird. / Kennzeichnung: “:”+(Richtung der Datenübertrag)+Ausdrücken Richtung der Datenübergang (IN,OUT,INOUT): IN Übergang von Java-Werten an die SqlAnweisungn. OUT Ergebnis der Ausführung der SqlAnweisung zurück zum Java-Programm. INOUT in beiden Richtungen gleichzeitig. 12 Beispiele / void updateStock ( Sting isbn , int stock )throws Exception{ #sql { UPDATE book SET stock=:stock where isbn=:isbn}; } / string findBook (String isbn)throws Exception{ String title; #sql {SELECT title INTO :title FROM book where isbn=:isbn}; } / #sql { INSERT INTO book_order VALUES ( :IN (++orderID), :IN custId), :IN(Date.ValueOf(“1999-09-16”)), 0) }; / #sql price={ VALUES( compute-price(:IN orderNo))}; 13 Iteratoren / Iterator ist ein Cursor-basierter Mechanismus für den Zugriff auf Mengen von Ergebnistupeln(vergleichbar mit ResultSet von JDBC). Iteratoren sind streng typisiert. / Nutzung: 1- Definition der Iterator-Klasse durch eine Sql-Deklaration. 2- Vereinbarung einer Iterator-Variablen. 3- Aufruf der Sql-Anweisung mit Instanziierung eines Iterator-Objekt. 4- Navigation über die Ergebnismenge und Auslesen der Daten. 5- Freigabe der Ressourcen durch Schließen des Iterators. / Es gibt zwei Arten von Iteratoren. 14 Iteratoren / Benannte Iteratoren: Zugriff über die Spaltennamen #sql public iterator Byname( String isbn , String title ); Byname iter; #sql iter={ SELECT isbn , title FROM book }; while( iter.next()){ System.out.println(“isbn=”+iter.isbn()); System.out.println(“title=”+iter.title()); } iter.close(); / Positionierte Iteratoren:Zugriff über die Host-Variablen #sql iterator ByPos( String, flaot); ByPos iter ; String title; float price; #sql iter={ SELECT title, price From book}; while(true) { #sql{ FETCH : iter INTO :title , : price}; if(iter.endFetch()) break; System.out.println(“title=”+title); System.out.println(“price=”+price); } 15 Verbindungskontexte / Eine Datenbankverbindung wird in SQLJ durch einen Verbindungskontext repräsentiert.Es gibt: - Defaultkontext(die einfachsteVerbindungskontext) - Kontextumschaltung(für mehrere Verbindungen). - Kontextqualifizierung. - Kontextklassen ( sie sind insbesondere sinvoll für eine semantische Überprüfung der Sql-Klauseln durch den Sqlj- Translator .) 16 Der SQLJ-Translator und Profile / Aufgabe des sqlj-Translators: 1- Ersetzung der Klauseln durch entsprechenden javaCode mit Aufrufen: > sqlj sqljDemo.sqlj 2- Syntaktisch und semantische Überprüfung der SqlAnweisungen(online und offline), 3- Generierung der Java-Codes für die deklarierten Iteratoren- und Kontextklassen, 4- Erzeugung der Profile. 17 Profile / Sind serialisierte Instanzen mit der “.ser” Endung. / werden von dem Translator generiert. / enthalten Informationen über die Sql-Operationen über Typ und Übergabeparameter und Ergebnisdaten. / Dienen zur Customization. / Beispiel 18 Beispiel / Sql-Klausel aus klasse SqlDemo: #sql {UPDATE book SET stock=:stock Where isbn=:isbn }; / Profildatei : profile SqlDemo_SJProfile0 entry 0 #sql { UPDATE book SET stock=? Where isbn =? }; line number :27 PREPARED_STATEMENT executed via EXECUTE_UDATE role is STATEMENT descriptor is null contain 2 parameters : 1.mode : IN , java type : int (int), sql type: INTEGER , name: stock, maker index: 25 2.mode: IN java type: java.lang.String(java.lang.String) , sql tpye: VARCHER , name: isbn, maker index : 50 result set type is NO_RESULT result set name is null contains no result colums 19 Java-Complierung Translator Java compiler Data.class Profil0: Data.sqlj Data.java Entry0 Profil0: [ctx0] Profil0 Entry0 {sql0} Entry1 Profil0 [ctxo] Profil1: Entry1 {sql1} Entry0 Profil1: [ctx1] Profil0.ser Entry0 {sql2} Entry0 Entry1 Entry0 Profil1.ser 20 Part 1: SQLJ gespeicherte Prozeduren/Funktionen / Sie sind die Prozeduren /Funktionen , die im Datenbankserver gespeichert und ausgeführt werden Vorteile: 1. lokale Zugriff und zentrale Verwaltung, 2. reduzierte Netzwerkbelastung, 3. gesteigerte Performance, 4. Anwendung von Datenbankdiensten, 5. gesenkte Administrationsaufwand, 6. unabhängig von der Client-Umgebung und im beliebigen Sprachen implementierbar. 21 Gespeicherte Proz. mit Java Entwicklung von gespeicherten Prozeduren/Funktionen / Implementierung : Es ist für einen direkten Datenzugriff mit Sql notwendig. / Installation im Server(jar-Archiv): Der Code der Prozedur wird zum Server übertragen. / Registrierung(CREATE Prozedur/Funktion): Die Prozedur wird dem Sql-System bekannt gemacht. / Aufruf(CALL bzw. VALUES): Die Prozeduren sind von Client-Anwendung nutzbar. 23 Implementierung / keine GUI_Funktionen realisierbar, / Keine Zugriff auf das Lokale Datensystem ist erlaubt, / Nur Default-Verbindung zur lokalen Datenbank, / Prozeduren /Funktionen sind als Klassenmethoden zu Implementiert(static-methoden ), / Es gibt drei Formen von Prozeduren: 1.no SQL, 2.reads SQL data, 3.modifies SQL data. 4.contains SQL 24 Beispiel / #sql iterator Iter ( double sum); public static double price (int orderNO)throws SQLException { Iter iter; double res=0.0; #sql iter = { SELECT SUM(b.price * oi.num) From order_item oi , book b Where oi.order_id=:orderno AND oi.isbn=b.isbn}; if(iter.next()) res=iter.sum(); return res; } 25 Installation und Registrierung / Installation : jar-Archiv CALL sqlj.install_jar ('url' ,' name', deploy) / Registrierung : CREATE Procedure sql-Name( SQL-Signature ) SQL-Eigenschaften External NAME Externe-java-Referenz LANGUAGE JAVA PARAMETER STYL JAVA ; 26 Beispiel / Die gespeicherte Prozedur public class Routines { public static double dm2euro ( double val) { return val/1.95583;} } / Installation > javac -d . Routines.java. > jar cf routines.jar Routines.class CALL sqlj.install_jar (' file: ~/routines.jar' , 'routines_jar ' , 0); / Registrierung CREATE FUNKTION dm2euro ( v FLOAT ) RETURNS FLOAT NO SQL EXTERNAL NAME 'routines_jar:Routines.dm2euro' LANGUAGE JAVA PARAMETER STYLE JAVA; 27 Java-Klassen für benutzer definierte SQL-Datentypen (SQLJ Part 2) / Installation der Java-Klassen im Datenbankserver und deren Nutzung als echte SQL_Datentypen. / Implementierung der Schnittstelle java.io.Serializable oder java.sql.SQLData / Installation: CALL sql.install_jar( 'url' , ' klass_name '); / Registrierung: CREATE..... 28 Fazit / SQLJ und JDBS arbeiten zusammen, um ein complete Set von Optionen für statische und dynamische SQL anzubieten. / SQLJ bringt mehr Produktivität und bessere Qualität mit. / SQLJ macht Java viel mehr akzeptabel für viele Business Applikationen.