Введение в SQLJ
История создания SQLJ и стандарты
Корпорация Oracle совместно с фирмами Sybase, IBM и рядом других разработала в 1997 году спецификацию SQLJ, определяющую синтаксис для встраивания SQL-операторов непосредственно в Java-программы. Сейчас действует две части стандарта SQL для SQLJ:
• SQL/JRT (SQL Rountines and Types for the Java Programming Language) – определяет возможность вызова методов Java как подпрограмм из SQL с помощью языка программирования Java.
• SQL/OLD (Object Language Bindings) – описывает, каким образом инструкции SQL встраиваются в программы на Java.
Особенности SQLJ
• Для встраивания SQL-операторов используются Java-типы. Это позволяет улавливать различия SQL-параметров, которые в других языках игнорируются. Результатом обработки SQL-запроса является Java-класс, содержащий среди прочего сведения о количестве, именах и типах полей.
• Пакет классов для поддержки SQLJ называет sqlj.runtime.
• Классы, создаваемые с использованием SQLJ, заканчиваются расширением .sqlj.
• В SQLJ можно определять и пользовательские типы данных на основе классов из JAR.
• Спецификация SQLJ регламентирует использование только статического SQL.
Транслятор SQLJ
Транслятор SQLJ является предкомпилятором, однако, он способен устанавливать связь с СУБД и проверять синтаксис, типы и схемы данных, а также статические SQL-операторы на реальных таблицах, т.е. тех, которые будут обрабатываться и во время исполнения готовой программы. Это позволяет на этапе компиляции выявлять и исправлять ошибки доступа.
Понятие контекста SQLJ
Приложения, подключившиеся к СУБД, имеют дело с некоторым контекстом, под которым понимается способ взаимодействия СУБД с конкретным приложением во время сеанса обмена данными. Осуществляется оно обычно путем обмена идентификаторами между приложением и СУБД. Каждый из них идентифицирует определенный контекст и называется указателем контекста (context handle). В SQLJ имеются следующие виды указателей контекстов:
• ConnectionContext – отслеживает соединение с БД. Фактически ConnectionContext – Это интерфейс, с помощью которого создается оболочка для функционирования объекта Connection.
• ExecuteContext – отслеживает данные, относящиеся к конкретному SQL-оператору. Несколько таких контекстов может входить в ConnectionContext.
Особенности доступа к БД
• Доступ к БД осуществляется через JDBC.
• Для выполнения SQL-оператора создается строка запроса, предваряемая строкой-флагом:
#sql[[<контекст>]] {SQL-оператор};
• Транзакции выполняются в рамках контекста. #sql[[<контекст>]] {commit | rollback};
Пример:
#sql Context EmpContext;
String url=”jdbc:Sybase:Tds:localhost: 2638”;
EmpContext empCtxt=new EmpContext(url,”dba”,”sql”,false);
#sql [empCtxt] {DELETE FROM Orders WHERE INum=3001};
Достоинства и недостатки SQLJ
• Запросы на SQLJ работают быстрее, чем на JDBC API.
• Все SQL-операторы на этапе компиляции проверяются препроцессором, следовательно, все ошибки синтаксиса выявляются еще на этом этапе, в отличие от JDBC API.
• План запроса создается один раз в отличие от JDBC API, что способствует большей скорости выполнения запросов.
• План выполнения запроса доступен для настройки программистом в отличие от JDBC API.
• Процесс компиляции программ на JDBC API быстрее.
• Препроцессор не входит в состав JDK и должен разрабатываться производителем СУБД.
ORACLE и SQLJ
Создание различных приложений на языке Java в Oracle производится в среде Oracle JDeveloper. В Oracle присутствует поддержка динамического SQLJ, но без проверки синтаксиса, типов, путей доступа и т.п., что характерно для обычного динамического SQL. Корпорация Oracle является одним из самых активных сторонников Java-технологии. Oracle поддерживает и внедряет разработки JavaSoft и других компаний, одновременно проводя собственные масштабные работы в области Java.