280 likes | 388 Views
1. 1. Java zum Zugriff auf Datenbanken SQLJ Mahboubeh Pakdaman 15.01.2001. 2. 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?.
E N D
1 1 Java zum Zugriff auf DatenbankenSQLJMahboubeh Pakdaman15.01.2001
2 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.java Data.class Data.sqlj SQLJ Translator Java Compiler
8 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 SQLJ-Komponenten • Der Translator übersetzt ein gegebenes SQLJ-Programm 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.
10 10 SQLJ-Klauseln • 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 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 Sql- Anweisungn. OUT Ergebnis der Ausführung der Sql- Anweisung 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 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); } iter.close();
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 java- Code mit Aufrufen: > sqlj sqljDemo.sqlj 2- Syntaktisch und semantische Überprüfung der Sql- Anweisungen(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
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.