Embedded SQL in Java Michael Stapf Berater Strategische Projekte ORACLE Deutschland GmbH JAVA DAYS ´98
Embedded SQL in Java
Michael StapfBerater Strategische ProjekteORACLE Deutschland GmbH
JAVA DAYS ´98
© 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
3© 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
© 1998 Sun Microsystems GmbH
JAVA DAYS ´98
Niederlassung Niederlassung Niederlassung
BackupBackup
Neue Neue AnwendungenAnwendungen
SoftwareSoftwareUpgradeUpgrade
Client/Server Verteilungskosten
© 1998 Sun Microsystems GmbH
JAVA DAYS ´98
Einsparpotential durch Network Computing
Niederlassung Niederlassung Niederlassung
Anwendungs-Server
Datenbank-Server
BackupBackup
Data Center
PC oder NC:Browser
Neue Neue AnwendungenAnwendungen
SoftwareSoftwareUpgradeUpgrade
6© 1998 Sun Microsystems GmbH
JAVA DAYS ´98
Java Unternehmens-Strategie
Java als die Sprache für Enterprise Network Computing
- ENTERPRISE CLASS JAVA SERVERENTERPRISE CLASS JAVA SERVER Plattform
- Infrastruktur für serverbasierte Java-Anwendungen
- Java VM
- JDBC-Treiber, Embedded SQL in Java: SQLJSQLJ
- Enterprise JavaBeans, CORBA
- Komponentenbasierte Java-Entwicklungswerkzeuge welche diese Plattform ausnutzen und unterstützen
© 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
Der Precompiler generiert Standard Java Sourcecode mit JDBC-Aufrufen
Überprüft die SQL-Anweisungen gegen die Datenbank
Der generierte Code wird wie jedes andere Java-Programm kompiliert
SQLJ-Code*.sqlj Datei
SQLJPräprozessor
Java-Codemit
JDBC-Aufrufen
Java Compiler Java
*.class Datei
DBMS
© 1998 Sun Microsystems GmbH
JAVA DAYS ´98
Vergleich JDBC mit SQLJ
java.sql.CallableStatement stmt;Connection conn;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();
JDBCJDBCResultSet results;
#sql results = {SELECT ename FROM emp WHERE sal > :salparam AND deptno = :deptnoparam};
SQLJSQLJ
8 fehleranfällige Anweisungen2 einfache Anweisungen
12© 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.
© 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
15© 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
© 1998 Sun Microsystems GmbH
JAVA DAYS ´98
SQLJ Client/Server-Verteilung
Java Anwendung
herstellerspez. C/S-Protokoll
PC
SQLJ RuntimeJDBC Typ 2
DBMS
SQLSQLSQLSQLStoredStored
ProceduresProceduresStoredStored
ProceduresProcedures
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
herstellerspez. C/S-Protokoll
SQLJ Verteilung auf den Anwendungs-Server
SQLJ kann für die “3 tier” Verteilung genutzt werden
JDBC Typ 2 und DBMS-Client verteilt auf den Anwendungs-Server
HTML-Seite
http Listenerhttp Dispatcher
HTTP
FIREWALL
BROWSER
Anwendungs- Server
SQLJAnwendungSQLJ Runtime
JDBC Typ 2SQL*Net
DBMS
SQLSQLSQLSQLStoredStored
ProceduresProceduresStoredStored
ProceduresProcedures
© 1998 Sun Microsystems GmbH
JAVA DAYS ´98
SQLJ Thin Client Verteilung
herstellerspez. Protokoll(TCP/IP)
HTTP Web Server
Gleiche Maschine
BROWSER
Java Anwendung
SQLJ Runtime
JDBC Typ 4SQL*Net
DBMS
SQLSQLSQLSQLStoredStored
ProceduresProceduresStoredStored
ProceduresProcedures
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
herstellerspez.C/S-Protokoll
IIOP
SQL*Net
ORACLE
SQL, Stored ProceduresSQL, Stored ProceduresSQL, Stored ProceduresSQL, Stored Procedures
JAVA VMJAVA VMJAVA VMJAVA VMEmbedded SQLJEmbedded SQLJEmbedded SQLJEmbedded SQLJ
Embedded JDBC DriverEmbedded JDBC DriverEmbedded JDBC DriverEmbedded JDBC Driver
DBMS
Java VMJava VM
© 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
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
SQLJ Sprachübersicht
SQLJ Sprachübersicht
© 1998 Sun Microsystems GmbH
JAVA DAYS ´98
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
Ausführbare KlauselnAusführbare Klauseln
© 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 SQL-Anweisungen 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 Java-Klassendefinition 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:orclsqlj.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 SQL- Anweisungen
- 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 SQL-Operationen 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
SQLJ ist ein reines Java-Programm welches JDBC zur Laufzeit nutzt
SQLJ-Programme sind für jede Datenbank anpassbar
Performance- setzt auf JDBC auf+ statische Optimierung
JDBC ist ein API für dynamisches SQL
JDBC-Treiber können mittels C, Java, … implementiert werden
JDBC-Treiber können Datenbank-spezifische Eigenschaften enthalten
© 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 positional Iterator)
© 1998 Sun Microsystems GmbH
JAVA DAYS ´98
Beispiel 1 import java.sql.*;
import sqlj.runtime.*; // SQLJ runtime classes
import sqlj.runtime.ref.*; // SQLJ runtime classes
#sql iterator EmpIter1 (String ENAME, double SAL);
public class Example1
{ public static void main (String args[])
throws SQLException
{
try { // Connect to the database
Class.forName("oracle.jdbc.driver.OracleDriver");
DefaultContext.setDefaultContext( new DefaultContext (
"jdbc:oracle:thin:@oudelsrv-1:5521:orcl", // url
"scott", // user
"tiger" )); // password
}
catch (Exception e) {
System.out.println("Error connecting to database.");
}
// Query the employee names
EmpIter1 emps;
#sql emps = { select ename, sal from emp
order by ename
};
while (emps.next()) {
System.out.println(
emps.ENAME() + " earns " + emps.SAL());
}
emps.close();
}
}
© 1998 Sun Microsystems GmbH
JAVA DAYS ´98
Beispiel 2import java.sql.*;
import sqlj.runtime.*; // SQLJ runtime classes
import sqlj.runtime.ref.*; // SQLJ runtime classes
#sql iterator EmpIter2 (float pay, String who);
public class Example2
{ public static void main (String args[])
throws SQLException
{
try { // Connect to the database
Class.forName("oracle.jdbc.driver.OracleDriver");
DefaultContext.setDefaultContext( new DefaultContext (
"jdbc:oracle:thin:@oudelsrv-1:5521:orcl", // url
"scott", // user
"tiger" )); // password
}
catch (Exception e) {
System.out.println("Error connecting to database.");
}
// Query employee names and salaries
EmpIter2 emps;
#sql emps = { select sal as "pay", ename as "who"
from emp order by ename
};
// Give each employee a 20% raise
while (emps.next()) {
float pay = emps.pay();
String who = emps.who();
#sql { update emp set sal = 1.2 * :pay
where ename = :who };
}
}
}
© 1998 Sun Microsystems GmbH
JAVA DAYS ´98
Beispiel 3import java.sql.*;
import sqlj.runtime.*; // SQLJ runtime classes
import sqlj.runtime.ref.*; // SQLJ runtime classes
#sql iterator EmpIter3 (String, double);
public class Example3
{ public static void main (String args[])
throws SQLException
{
try { // Connect to the database
Class.forName("oracle.jdbc.driver.OracleDriver");
DefaultContext.setDefaultContext( new DefaultContext (
"jdbc:oracle:thin:@oudelsrv-1:5521:orcl", // url
"scott", // user
"tiger" )); // password
}
catch (Exception e) {
System.out.println("Error connecting to database.");
}
// Query the employee names
EmpIter3 emps;
#sql emps = { select ename, sal from emp order by ename };
String ename = null; double sal = 0.0;
while (true) {
#sql {FETCH :emps INTO :ename, :sal};
if (emps.endFetch()) break;
System.out.println(ename + " earns " + sal);
}
emps.close();
}
}
© 1998 Sun Microsystems GmbH
JAVA DAYS ´98
Weitere Informationen über SQLJ
- Freier Download von: http://www.oracle.com/produkte/free_software/#sqlj
- Kommentare an :