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