SQLJ
SQLJ — рабочее название усилий по объединению Java и SQL . Это была совместная работа, начатая примерно в 1997 году инженерами IBM , Oracle , Compaq , Informix , Sybase , Cloudscape и Sun Microsystems .
Он состоит из трех частей: 0, 1 и 2. Часть 0 описывает встраивание операторов SQL в программы Java. SQLJ, часть 0, является основой части 10 стандарта SQL:1999 , также известного как привязки объектного языка SQL (SQL/OLB). [1] Части 1 и 2 SQLJ описывают обратную возможность использования классов Java (подпрограмм и типов) из операторов SQL. Части 1 и 2 составляют основу части 13 стандарта SQL « Процедуры и типы SQL с использованием языка программирования Java (SQL/JRT)».
«SQLJ» обычно используется для обозначения только части 0 SQLJ, обычно когда его сравнивают с другими средствами внедрения SQL в Java, такими как JDBC .
Стандарты ANSI и ISO
[ редактировать ]- SQLJ, часть 0: ANSI X3.135.10-1998, «Язык баз данных SQL — Часть 10: Привязки объектного языка (SQL/OLB)»
- SQLJ, часть 1: ANSI NCITS 331.1-1999, «SQLJ — Часть 1: Подпрограммы SQL с использованием языка программирования Java».
- SQLJ, часть 2: ANSI NCITS 331.2-2000, «SQLJ — Часть 2: Типы SQL с использованием языка программирования Java»
Часть 0 была обновлена для совместимости с JDBC 2.0 и ратифицирована ISO в 2000 году. Последние две части были объединены при подаче в ISO. Часть 2 была существенно переписана для представления ISO, поскольку версия ANSI не была достаточно формальной для спецификации и была ближе по стилю к руководству пользователя . Объединенная версия была ратифицирована в 2002 году. [1]
- ISO/IEC 9075-10:2000, Информационные технологии. Языки баз данных. SQL. Часть 10. Привязки объектного языка (SQL/OLB).
- ISO/IEC 9075-13:2002, Информационные технологии. Языки баз данных. SQL. Часть 13. Подпрограммы и типы SQL с использованием языка программирования Java (SQL/JRT) .
SQLJ, часть 0
[ редактировать ]Спецификация SQLJ, часть 0, в основном возникла у Oracle, которая также предоставила первую эталонную реализацию. [1]
В дальнейшем SQLJ является синонимом SQLJ, часть 0.
В то время как JDBC предоставляет API , SQLJ состоит из расширения языка . Таким образом, программы, содержащие SQLJ, должны быть пропущены через препроцессор (транслятор SQLJ), прежде чем их можно будет скомпилировать.
Преимущества
[ редактировать ]Некоторые преимущества SQLJ перед JDBC включают в себя:
- Команды SQLJ обычно короче, чем эквивалентные программы JDBC.
- Синтаксис SQL можно проверить во время компиляции. Возвращенные результаты запроса также могут быть строго проверены.
- Препроцессор может генерировать статический SQL, который работает лучше, чем динамический SQL, поскольку план запроса создается во время компиляции программы, сохраняется в базе данных и повторно используется во время выполнения. Статический SQL может гарантировать стабильность плана доступа. IBM DB2 поддерживает использование статического SQL в программах SQLJ.
Недостатки
[ редактировать ]- SQLJ требует этапа предварительной обработки.
- Многие IDE не поддерживают SQLJ.
- В SQLJ отсутствует поддержка большинства распространенных инфраструктур персистентности, таких как Hibernate .
- Oracle 18c (12.2) прекратил поддержку SQLJ в базе данных.
Примеры
[ редактировать ]В следующих примерах сравнивается синтаксис SQLJ с использованием 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)
};
|
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ Перейти обратно: а б с Джим Мелтон (2003). Расширенный SQL: 1999 . Морган Кауфманн. стр. 352-364 . ISBN 978-1-55860-677-7 .
Дальнейшее чтение
[ редактировать ]- Конни Цуй, Рассмотрение SQLJ для ваших Java-приложений DB2 V8 , IBM Developerworks , 13 февраля 2003 г.
- Оуэн Клайн, Разрабатывайте приложения с помощью SQLJ , IBM Developerworks, 16 декабря 2004 г.
- Джейсон Прайс (2001). Программирование на Java с использованием Oracle SQLJ . О'Рейли Медиа. ISBN 978-0-596-00087-5 .