JAVA DAYS ´98 Embedded SQL in Java Michael Stapf Berater Strategische Projekte ORACLE Deutschland GmbH JAVA DAYS ´98 Agenda Java im Unternehmen - Warum Java? - Vorteile - Strategie Embedded SQL in Java: SQLJ - Einleitung - Verteilungskonfigurationen - SQLJ Translator - Beispiele © 1998 Sun Microsystems GmbH JAVA DAYS ´98 Warum Java im Unternehmen? Java ist bereit die dominierende Sprache für unternehmenskritische Anwendungen zu werden Java - eine hochproduktive Programmiersprache - Objektorientiert, Komponentenmodelle - Know-how verfügbar Java ist geeignet für eine neue Klasse von Unternehmens-Anwendungen - Unternehmens-Anwendungen migrieren von Client/Server hin zu Thin Client-basierten Intranets 3 © 1998 Sun Microsystems GmbH JAVA DAYS ´98 Client/Server Verteilungskosten Niederlassung Niederlassung Backup Neue Anwendungen Software Upgrade © 1998 Sun Microsystems GmbH Niederlassung JAVA DAYS ´98 Einsparpotential durch Network Computing PC oder NC: Browser Niederlassung Niederlassung Backup Neue Anwendungen Software Upgrade AnwendungsServer DatenbankServer Data Center © 1998 Sun Microsystems GmbH Niederlassung JAVA DAYS ´98 Java Unternehmens-Strategie Java als die Sprache für Enterprise Network Computing - ENTERPRISE CLASS JAVA SERVER Plattform - Infrastruktur für serverbasierte Java-Anwendungen - Java VM - JDBC-Treiber, Embedded SQL in Java: SQLJ - Enterprise JavaBeans, CORBA - Komponentenbasierte Java-Entwicklungswerkzeuge welche diese Plattform ausnutzen und unterstützen 6 © 1998 Sun Microsystems GmbH JAVA DAYS ´98 Agenda Java im Unternehmen - Warum Java? - Vorteile - Strategie Embedded SQL in Java: SQLJ - Einleitung - Verteilungskonfigurationen - SQLJ Translator - Beispiele © 1998 Sun Microsystems GmbH JAVA DAYS ´98 Embedded SQL in Java: SQLJ SQLJ ermöglicht Anwendungsentwicklern: - Einbettung von SQL-Anweisungen in Java-Programmen - Präprozessor zur Übersetzung von SQLJ in Java-Code mit JDBC-Aufrufen - Laufzeitumgebung: Nutzung von JDBC-Treibern beliebiger Hersteller SQLJ verbessert die Entwicklungsproduktivität - Wesentlich kompakterer Code als mit JDBC - Typüberprüfung von SQL-Anweisungen zur Kompilierungszeit - Wartbare und einfacher zu schreibende Java-Programme © 1998 Sun Microsystems GmbH JAVA DAYS ´98 Elemente von SQLJ Standardisierter Sprachsyntax Gemeinsame Spezifikation verschiedener Hersteller SQLJ Translator Frei verfügbare Referenz-Implementierung © 1998 Sun Microsystems GmbH JAVA DAYS ´98 Der SQLJ Translator SQLJ-Code *.sqlj Datei SQLJ Präprozessor Java-Code mit JDBCAufrufen Java Compiler Java *.class Datei DBMS Der Precompiler generiert Standard Java Sourcecode mit JDBC-Aufrufen Überprüft die SQL-Anweisungen gegen die Datenbank Der generierte Code wird wie jedes andere JavaProgramm kompiliert © 1998 Sun Microsystems GmbH JAVA DAYS ´98 Vergleich JDBC mit SQLJ JDBC SQLJ java.sql.CallableStatement stmt; Connection conn; ResultSet results; ResultSet results; conn = DriverManager.getConnection (“jdbc:default”); stmt = conn.prepareStatement (“SELECT ename FROM emp WHERE sal > ? AND deptno = ?”); stmt.setInteger(1, salparam); stmt.setInteger(2, deptnoparam); results = stmt.executeQuery(); 8 fehleranfällige Anweisungen #sql results = {SELECT ename FROM emp WHERE sal > :salparam AND deptno = :deptnoparam}; 2 einfache Anweisungen © 1998 Sun Microsystems GmbH JAVA DAYS ´98 SQLJ Standardisierung SQLJ Partner: Compaq/Tandem, IBM, Informix, Javasoft, Oracle, Sybase und andere SQLJ Translator - SQLJ-Sprachspezifikation wurde beim ANSI/ISO-Komitee eingereicht - Die Translatoren verschiedener Hersteller sind kompatibel Generiert Java-Code 100% kompatibel mit der JDBC Spezifikation - Binärportabilität von SQLJ Stored Procedures Integrierbar mit Standard Java-Werkzeugen - Source Level Debugger etc. 12 © 1998 Sun Microsystems GmbH JAVA DAYS ´98 SQLJ Standardisierung Bestandteile: - Part 0: Standard Syntax für Stored Procedures und Trigger in Java - Part 1: Syntax für Embedded SQL in Java © 1998 Sun Microsystems GmbH JAVA DAYS ´98 Agenda Java im Unternehmen - Warum Java? - Vorteile - Strategie Embedded SQL in Java: SQLJ - Einleitung - Verteilungskonfigurationen - SQLJ Translator - Beispiele © 1998 Sun Microsystems GmbH JAVA DAYS ´98 Verteilungskonfigurationen SQLJ bietet verschiedene Möglichkeiten - Client/Server mit JDBC Typ 2 Treibern - Thin Clients mit JDBC Typ 4 Treibern - 3-tier Anwendungen mit Typ 2 Treibern - SQLJ in der Datenbank 15 © 1998 Sun Microsystems GmbH JAVA DAYS ´98 SQLJ Client/Server-Verteilung PC Java Anwendung SQLJ Runtime JDBC Typ 2 DBMS herstellerspez. C/S-Protokoll SQL Stored Procedures SQLJ ist für Client/Server Java Anwendungen einsetzbar Java Application, SQLJ Runtime, und JDBC Typ 2 Treiber auf dem Client © 1998 Sun Microsystems GmbH JAVA DAYS ´98 SQLJ Verteilung auf den Anwendungs-Server BROWSER HTTP http Listener http Dispatcher HTMLSeite SQLJ Anwendung FIREWALL SQLJ Runtime JDBC Typ 2 AnwendungsServer DBMS herstellerspez. C/S-Protokoll SQL SQL*Net Stored Procedures SQLJ kann für die “3 tier” Verteilung genutzt werden JDBC Typ 2 und DBMS-Client verteilt auf den AnwendungsServer © 1998 Sun Microsystems GmbH JAVA DAYS ´98 SQLJ Thin Client Verteilung BROWSER Java Anwendung HTTP Web Server DBMS SQLJ Runtime JDBC Typ 4 herstellerspez. Protokoll (TCP/IP) SQL SQL*Net Stored Procedures Gleiche Maschine Herunterladbare Applets verbinden sich direkt mit der Datenbank Java Security-Anforderungen Datenbank muß sich auf der gleichen Maschine befinden wie der Webserver Keine Restriktionen für JDK 1.1 Signed Applets © 1998 Sun Microsystems GmbH JAVA DAYS ´98 SQLJ Translator in der Datenbank ORACLE DBMS IIOP herstellerspez. C/S-Protokoll Java VM SQL*Net Embedded JAVASQLJ VM Embedded JDBC Driver SQL, Stored Procedures © 1998 Sun Microsystems GmbH JAVA DAYS ´98 Agenda Java im Unternehmen - Warum Java? - Vorteile - Strategie Embedded SQL in Java: SQLJ - Einleitung - Verteilungskonfigurationen - SQLJ Translator - Beispiele © 1998 Sun Microsystems GmbH JAVA DAYS ´98 SQLJ Translator Sprachkonstrukte - Überblick - Ausführbare SQL-Klauseln - Connection Management - Result Set Iterator Objekte Translator Werkzeug Vorteile © 1998 Sun Microsystems GmbH JAVA DAYS ´98 SQLJ Sprachübersicht Ein SQLJ-Programm ist ein Java-Programm mit eingebetteten SQLJ-Konstrukten SQLJ-Konstrukte beginnen mit ‘#sql’ und enden mit ‘;’ Es gibt zwei Arten von SQLJ-Klauseln Ausführbar Deklarativ © 1998 Sun Microsystems GmbH JAVA DAYS ´98 Ausführbare Klauseln Ein auführbares Konstrukt enthält SQL in geschweiften Klammern #sql { INSERT INTO emp (ename, sal) VALUES ('Scott', 35000) }; Text innerhalb der geschweiften Klammern nutzt SQL Regeln, ansonsten Java Regeln Ausführbare Klauseln sind dort einsetzbar wo auch Java Blockanweisungen erlaubt sind © 1998 Sun Microsystems GmbH JAVA DAYS ´98 Bind-Variablen Ausführbare Konstrukte können Java Bind-Variablen enthalten. Gekennzeichnet durch vorangestellten Doppelpunkt ':' String name = “SMITH”; double salary = 25000.0; #sql { UPDATE emp SET sal = :salary WHERE ename = :name }; Bind-Variablen können lokale Variablen, Parameter oder Felder sein © 1998 Sun Microsystems GmbH JAVA DAYS ´98 Bind-Variablen: Unterstützte Typen Standard JDBC Typen - boolean, byte, short, int, long, double, float - String, byte[] - java.sql.Date, java.sql.Time, java.sql.Timestamp Java Wrapper Klassen - Boolean, Byte, Short, Integer, Long, Double, Float Stream Klassen (package sqlj.runtime) - BinaryStream, AsciiStream, UnicodeStream Herstellerspezifische Typen © 1998 Sun Microsystems GmbH JAVA DAYS ´98 Runtime Connection zur Datenbank Laden des JDBC-Treibers wie in einer JDBC-Session Class.forName (“oracle.jdbc.driver.OracleDriver”); Erzeugung einer Datenbankverbindung DefaultContext ctx = new DefaultContext( “jdbc:oracle:thin:@localhost:1521:orcl”, user, password); Installation als default Verbindung DefaultContext.setDefaultContext(ctx); Oder explizit in einer ausführbaren Klausel #sql [ctx] { SQL operation }; © 1998 Sun Microsystems GmbH JAVA DAYS ´98 Deklaration des ConnectionContext ConnectionContext Klassen sind auch explizit deklarierbar #sql context MyContext; Deklariert eine Klasse die zur Ausführung von SQLAnweisungen nutzbar ist MyContext myCtx = new MyContext(url, user, password); #sql [myCtx] { … }; Deklarationen können dort eingesetzt werden wo auch Klassendeklarationen erlaubt sind © 1998 Sun Microsystems GmbH JAVA DAYS ´98 Connection Management Mehrere Verbindungskontexte können gleichzeitig instantiiert und genutzt werden Verschiedene Verbindungskontext-Klassen können zur Partitionierung von Anweisungen die in verschiedenen Schemas ausgeführt werden genutzt werden Zur Übersetzungszeit kann für jede Verbindungskontext-Klasse eine unterschiedliche SQL-Überprüfung vorgenommen werden © 1998 Sun Microsystems GmbH JAVA DAYS ´98 Ausführung einer Abfrage Definition eines Iterator-Typs Erzeugung einer Instanz des Iterator-Typs Füllen des Iterators mit Abfrageergebnissen Nutzung der Iterator-Methoden um auf Abfragespalten per Namen zuzugreifen (Named Iterator) ODER FETCH..INTO Syntax für den Zugriff auf Abfragespalten per Position (Positional Iterator) © 1998 Sun Microsystems GmbH JAVA DAYS ´98 Definition eines Named Iterator Typs Explizite Bereitstellung der Java Namen und Typen der Abfragespalten Die Java-Names der Iterator-Spalten sollten mit den SQL-Namen in der Abfrage übereinstimmen Die Iterator-Typen Definition sollte dort eingesetzt werden wo eine JavaKlassendefinition erlaubt ist © 1998 Sun Microsystems GmbH JAVA DAYS ´98 Beispiel eines Named Iterator #sql iterator EmpIter (String ENAME, double SAL); Dies definiert eine Klasse EmpIter mit unter anderem folgenden Methoden: boolean next(); // gets next row, // if any String ENAME (); // gets column ENAME // as String double SAL (); // gets column SAL // as double void close (); // closes iterator © 1998 Sun Microsystems GmbH JAVA DAYS ´98 Einsatz des Iterators für eine Abfrage Deklaration einer Variablen des Iterator Typs Instantiierung des Iterator-Typs mit einer SQL-Abfrage EmpIter emps; #sql emps = { SELECT ename, sal FROM emp }; © 1998 Sun Microsystems GmbH JAVA DAYS ´98 Holen der Abfragespalten next() füllt den Iterator mit dem Result Set der aktuellen Zeile der Abfrage (nutzt den Spaltennamen) Lesen der Daten mit den Iterator-Methoden while (emps.next ()) { String ename = emps.ENAME (); double sal = emps.SAL (); … } Schließen des Iterators zur Ressourcenfreigabe emps.close(); © 1998 Sun Microsystems GmbH JAVA DAYS ´98 Beispiel eines Positional Iterators Positional Iterator Typen holen Abfragespalten per Position (nicht per Name) #sql iterator EmpIter2 (String, double); … EmpIter2 emps; #sql emps = { SELECT ename, sal FROM emp }; while (true) { String ename = null; double sal = 0.0; #sql { FETCH :emps INTO :ename, :sal}; if (emps.endFetch()) break; ... } emps.close(); © 1998 Sun Microsystems GmbH JAVA DAYS ´98 SQLJ Translator Sprachkonstrukte Translator Werkzeug - Translator Installation und Setup - SQLJ Programmübersetzung und Java Kompilierungsanweisungen - Nutzung eines SQL Checkers während der Übersetzung Vorteile © 1998 Sun Microsystems GmbH JAVA DAYS ´98 SQLJ Setup Installation - SQLJ benötigt JDK 1.1 oder höher - SQLJ ist ein reines Java Programm, daher muß nur der CLASSPATH angepasst werden um die SQLJ-Klassen zu finden Setup Nutzerumgebung - %JAVA_HOME%\sqlj\lib\translator.zip im CLASSPATH - %JAVA_HOME%\sqlj\bin im PATH © 1998 Sun Microsystems GmbH JAVA DAYS ´98 Kompilierung eines SQLJ-Programms Übersetzung des SQLJ Programms % sqlj [options] Beispiel1.sqlj (erzeugt java Datei + Serialized Profiles) Kompilierung der sich ergebenden Java-Datei % javac Beispiel1.java Ablauf des Programms % java Beispiel1 © 1998 Sun Microsystems GmbH JAVA DAYS ´98 Verbindung zur Datenbank zur Übersetzungszeit Ermöglicht statische SQL-Überprüfung SQLJ Translator verbindet sich zur Datenbank, und überprüft ob Tabellen und Stored Procedures im Schema enthalten sind. Der Translator überprüft ob die SQL Anweisungen für die vorkommenden Tabellen und Prozeduren korrekt sind. Umgebungsargumente: Das default Schema zum Login, der JDBC Treiber, etc. -- können in die properties Datei eingetragen werden © 1998 Sun Microsystems GmbH JAVA DAYS ´98 SQLJ Properties Datei Short-cut für lange Kommandozeilen Benennung: sqlj.properties Ermöglicht für Benutzer die Online-Überprüfung sqlj.user=scott Andere Einstellungen für die Übersetzung sqlj.url=jdbc:oracle:thin:@localhost:1521:orcl sqlj.password=tiger Herstellerspezifische Einstellungen - Zu verwendende JDBC-Treiber - Zu verwendende SQL Checker © 1998 Sun Microsystems GmbH JAVA DAYS ´98 SQLJ Translator Sprachkonstrukte Translator Werkzeug Vorteile - Höheres Abstraktionsniveau als bei JDBC - Frühe Überprüfung der statischen SQLAnweisungen - Stark typisierte Iteratoren © 1998 Sun Microsystems GmbH JAVA DAYS ´98 SQLJ: Höherer Abstraktionsgrad als JDBC SQLJ unterstützt eine default Verbindung JDBC-Anweisungsobjekte sind verborgen SQL-Anweisungen können mehrere Zeilen umfassen Bind-Variablen sind direkt in SQLOperationen eingebettet Automatisches Behandlung von Null-Werten © 1998 Sun Microsystems GmbH JAVA DAYS ´98 SQLJ: Prägnanter als JDBC int n = 17950; // SQLJ #sql {insert into EMP values (:n)}; // JDBC Statement stmt = conn.prepareStatement ("insert into EMP values (?)"); stmt.setInt (1, n); stmt.execute (); stmt.close (); © 1998 Sun Microsystems GmbH JAVA DAYS ´98 Frühe Typen-Überprüfung Date d = new Date (1993,3,11); // SQLJ #sql {insert into EMP (sal) values (:d)}; Translator überprüft die Typen der Java Variablen gegen SQL-Typen Wirft einen Type Mismatch Error Ein äquivalentes JDBC-Programm würde nur einen Laufzeitfehler verursachen SQLJ-Programme sind robust © 1998 Sun Microsystems GmbH JAVA DAYS ´98 Stark getypte Iteratoren Stark getypte Iteratoren bieten eine Typüberprüfung durch Java Iteratoren sind Java Objektse Sind deklarierbar, übergebar an Methoden und zurückgebar als Ergebnisse © 1998 Sun Microsystems GmbH JAVA DAYS ´98 Gegenüberstellung SQLJ und JDBC SQLJ ist eine Sprache für statisches SQL JDBC ist ein API für dynamisches SQL SQLJ ist ein reines JavaProgramm welches JDBC zur Laufzeit nutzt JDBC-Treiber können mittels C, Java, … implementiert werden SQLJ-Programme sind für jede Datenbank anpassbar JDBC-Treiber können Datenbank-spezifische Eigenschaften enthalten Performance - setzt auf JDBC auf + statische Optimierung © 1998 Sun Microsystems GmbH JAVA DAYS ´98 Agenda Java im Unternehmen - Warum Java? - Vorteile - Strategie Embedded SQL in Java: SQLJ - Einleitung - Verteilungskonfigurationen - SQLJ Translator - Beispiele © 1998 Sun Microsystems GmbH JAVA DAYS ´98 Beispiele BeispielTemplate.sqlj import sqlj.runtime.*; // Use SQLJ runtime import sqlj.runtime.ref.*; // More SQLJ runtime import java.sql.*; // Use JDBC too … iterator declarations go here … class ExampleTemplate { public static void main (String args []) throws SQLException { … hier SQLJ Code einfügen … } } © 1998 Sun Microsystems GmbH JAVA DAYS ´98 SQLJ Beispiele Example1.sqlj: Ausgabe der Namen und Gehälter aller Angestellten - Abfrage die ENAME und SAL der Tabelle EMPLOYEE selektiert. ENAME wird als Java String und SAL als Java double geholt. Example2.sqlj: Gehaltserhöhung für alle Mitarbeiter - Deklaration eines Iterators um alle Namen und Gehälter der Mitarbeiter zu erhalten - Update des Gehalts jedes Mitarbeiters mittles Java Bind-Variablen Example3.sqlj: (wie Beispiel 1 nur mit © 1998 Sun Microsystems GmbH // SQLJ runtime classes } { } { // password "tiger" )); © 1998 Sun Microsystems GmbH emps.close(); } emps.ENAME() + " earns " + emps.SAL()); System.out.println( while (emps.next()) { }; order by ename #sql emps = { select ename, sal from emp EmpIter1 emps; // Query the employee names } System.out.println("Error connecting to database."); catch (Exception e) { } // user "scott", "jdbc:oracle:thin:@oudelsrv-1:5521:orcl", // url DefaultContext.setDefaultContext( new DefaultContext ( Class.forName("oracle.jdbc.driver.OracleDriver"); try { // Connect to the database throws SQLException public static void main (String args[]) public class Example1 #sql iterator EmpIter1 (String ENAME, double SAL); import sqlj.runtime.ref.*; // SQLJ runtime classes import sqlj.runtime.*; import java.sql.*; JAVA DAYS ´98 Beispiel 1 // SQLJ runtime classes } { } { // password "tiger" )); © 1998 Sun Microsystems GmbH { } where ename = :who }; #sql { update emp set sal = 1.2 * :pay String who = emps.who(); float pay = emps.pay(); while (emps.next()) // Give each employee a 20% raise }; from emp order by ename #sql emps = { select sal as "pay", ename as "who" EmpIter2 emps; // Query employee names and salaries } System.out.println("Error connecting to database."); catch (Exception e) { } // user "scott", "jdbc:oracle:thin:@oudelsrv-1:5521:orcl", // url DefaultContext.setDefaultContext( new DefaultContext ( Class.forName("oracle.jdbc.driver.OracleDriver"); try { // Connect to the database throws SQLException public static void main (String args[]) public class Example2 #sql iterator EmpIter2 (float pay, String who); import sqlj.runtime.ref.*; // SQLJ runtime classes import sqlj.runtime.*; import java.sql.*; JAVA DAYS ´98 Beispiel 2 // SQLJ runtime classes } { } { // password "tiger" )); © 1998 Sun Microsystems GmbH System.out.println(ename + " earns " + sal); if (emps.endFetch()) break; emps.close(); } double sal = 0.0; #sql {FETCH :emps INTO :ename, :sal}; while (true) { String ename = null; #sql emps = { select ename, sal from emp order by ename }; EmpIter3 emps; // Query the employee names } System.out.println("Error connecting to database."); catch (Exception e) { } // user "scott", "jdbc:oracle:thin:@oudelsrv-1:5521:orcl", // url DefaultContext.setDefaultContext( new DefaultContext ( Class.forName("oracle.jdbc.driver.OracleDriver"); try { // Connect to the database throws SQLException public static void main (String args[]) public class Example3 #sql iterator EmpIter3 (String, double); import sqlj.runtime.ref.*; // SQLJ runtime classes import sqlj.runtime.*; import java.sql.*; JAVA DAYS ´98 Beispiel 3 JAVA DAYS ´98 Weitere Informationen über SQLJ - Freier Download von: http://www.oracle.com/produkte/free_soft ware/#sqlj - Kommentare an : [email protected] © 1998 Sun Microsystems GmbH