SQLJ - SQLJ
SQLJ je zastaralý pracovní název pro snahy o kombinaci Java a SQL . Bylo to společné úsilí zahájené kolem roku 1997 inženýry z IBM , Oracle , Compaq , Informix , Sybase , Cloudscape a Sun Microsystems .
Skládá se ze tří částí: 0, 1 a 2. Část 0 popisuje vkládání příkazů SQL do programů Java. SQLJ část 0 je základem pro část 10 standardu SQL: 1999 , aka SQL Object Language Bindings (SQL / OLB). Část 1 a 2 SQLJ popisuje obrácenou možnost používat třídy Java (rutiny a typy) z příkazů SQL. Části 1 a 2 jsou základem pro část 13 standardu SQL, rutiny a typy SQL pomocí programovacího jazyka Java (SQL / JRT).
„SQLJ“ se běžně používá k označení právě SQLJ část 0, obvykle když je v kontrastu s jinými prostředky pro vkládání SQL do Javy, jako je JDBC .
Obsah
Normy ANSI a ISO
- SQLJ část 0: ANSI X3.135.10-1998, „Databázový jazyk SQL - Část 10: Vazby jazykového objektu (SQL / OLB)“
- SQLJ část 1: ANSI NCITS 331.1-1999, „SQLJ - Část 1: Rutiny SQL pomocí programovacího jazyka Java“
- SQLJ část 2: ANSI NCITS 331.2-2000, „SQLJ - část 2: Typy SQL používající programovací jazyk Java“
Část 0 byla aktualizována pro kompatibilitu s JDBC 2.0 a ratifikována ISO v roce 2000. Poslední dvě části byly při předání ISO kombinovány. Část 2 byla v zásadě přepsána pro podání ISO, protože verze ANSI nebyla pro specifikaci dostatečně formální, protože se blížila stylu uživatelské příručky . Kombinovaná verze byla ratifikována v roce 2002.
- ISO / IEC 9075-10: 2000, Informační technologie - Databázové jazyky - SQL - Část 10: Vazby jazyků objektů (SQL / OLB)
- ISO / IEC 9075-13: 2002, Informační technologie - Databázové jazyky - SQL - Část 13: Rutiny a typy SQL používající programovací jazyk Java (SQL / JRT) .
SQLJ část 0
Specifikace SQLJ část 0 do značné míry pochází od společnosti Oracle, která také poskytla první referenční implementaci.
V následujícím SQLJ je synonymum pro SQLJ část 0.
Zatímco JDBC poskytuje API , SQLJ se skládá z rozšíření jazyka . Programy obsahující SQLJ tedy musí být před kompilací spuštěny pomocí preprocesoru (překladače SQLJ).
Výhody
Mezi výhody SQLJ oproti JDBC patří:
- Příkazy SQLJ bývají kratší než ekvivalentní programy JDBC.
- Syntaxi SQL lze zkontrolovat v době kompilace. Výsledky vrácených dotazů lze také přísně zkontrolovat.
- Preprocesor může generovat statický SQL, který funguje lépe než dynamický SQL, protože plán dotazů je vytvořen v době kompilace programu, uložen v databázi a znovu použit za běhu. Statický SQL může zaručit stabilitu přístupového plánu. IBM DB2 podporuje statické použití SQL v programech SQLJ.
Nevýhody
- SQLJ vyžaduje krok předzpracování.
- Mnoho IDE nemá podporu SQLJ.
- SQLJ postrádá podporu pro většinu běžných persistence frameworků, jako je Hibernate .
- Oracle 18c (12.2) zrušil podporu SQLJ v databázi.
Příklady
Následující příklady porovnávají syntaxi SQLJ s využitím JDBC.
| JDBC | SQLJ |
|---|---|
PreparedStatement stmt = conn.prepareStatement(
"SELECT LASTNAME"
+ " , FIRSTNME"
+ " , SALARY"
+ " FROM DSN8710.EMP"
+ " WHERE SALARY BETWEEN ? AND ?");
stmt.setBigDecimal(1, min);
stmt.setBigDecimal(2, max);
ResultSet rs = stmt.executeQuery();
while (rs.next()) {
lastname = rs.getString(1);
firstname = rs.getString(2);
salary = rs.getBigDecimal(3);
// Print row...
}
rs.close();
stmt.close();
|
#sql private static iterator EmployeeIterator(String, String, BigDecimal);
...
EmployeeIterator iter;
#sql [ctx] iter = {
SELECT LASTNAME
, FIRSTNME
, SALARY
FROM DSN8710.EMP
WHERE SALARY BETWEEN :min AND :max
};
do {
#sql {
FETCH :iter
INTO :lastname, :firstname, :salary
};
// Print row...
} while (!iter.endFetch());
iter.close();
|
| JDBC | SQLJ |
|---|---|
PreparedStatement stmt = conn.prepareStatement(
"SELECT MAX(SALARY), AVG(SALARY)"
+ " FROM DSN8710.EMP");
rs = stmt.executeQuery();
if (!rs.next()) {
// Error—no rows found
}
maxSalary = rs.getBigDecimal(1);
avgSalary = rs.getBigDecimal(2);
if (rs.next()) {
// Error—more than one row found
}
rs.close();
stmt.close();
|
#sql [ctx] {
SELECT MAX(SALARY), AVG(SALARY)
INTO :maxSalary, :avgSalary
FROM DSN8710.EMP
};
|
| JDBC | SQLJ |
|---|---|
stmt = conn.prepareStatement(
"INSERT INTO DSN8710.EMP " +
"(EMPNO, FIRSTNME, MIDINIT, LASTNAME, HIREDATE, SALARY) "
+ "VALUES (?, ?, ?, ?, CURRENT DATE, ?)");
stmt.setString(1, empno);
stmt.setString(2, firstname);
stmt.setString(3, midinit);
stmt.setString(4, lastname);
stmt.setBigDecimal(5, salary);
stmt.executeUpdate();
stmt.close();
|
#sql [ctx] {
INSERT INTO DSN8710.EMP
(EMPNO, FIRSTNME, MIDINIT, LASTNAME, HIREDATE, SALARY)
VALUES
(:empno, :firstname, :midinit, :lastname, CURRENT DATE, :salary)
};
|
Viz také
Reference
Další čtení
- Connie Tsui, s ohledem na SQLJ pro vaše Java Java aplikace DB2 V8 , IBM developerworks , 13. února 2003
- Owen Cline, vývoj aplikací pomocí SQLJ , IBM developerworks, 16. prosince 2004
- Jason Price (2001). Programování v Javě s Oracle SQLJ . O'Reilly Media. ISBN 978-0-596-00087-5 .