Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

JAVA. Серверные приложения

.pdf
Скачиваний:
0
Добавлен:
06.09.2026
Размер:
2 Мб
Скачать
Часть 5. Работа с базами данных при помощи Java 251
встроенных объектов SQLJ облегчает создание приложений со множе­ственным доступом различных пользователей, таких, как Web-клиенты.
Статические SQL-операторы постоянны и существуют, пока сущест-
вует пакет, в котором они находятся. Динамические SQL-операторы хранятся в памяти, освобождая ресурсы после окончания работы с ба­зой данных. Динамические операторы могут быть перекомпилированы во время исполнения программы, и тогда данные, хранящиеся в памяти, будут содержать неправильные значения. Выполнение статических опе­раторов в большинстве случаев значительно быстрее, чем их динамиче­ских аналогов, однако очень многое в данном вопросе зависит о других внешних факторов, конструкции запроса, использования внешних пере­менных, управление курсорами и вызовами хранимых процедур и т. д.
Глава 34. Основные задачи использования SQLJ
Создание приложений, работающих с базами данных, должны вызы-
вать методы, описанные в пакетах, предназначенных для работы с ба­зами данных, таких, как JDBC или SQLJ. Распространяемый фирмой SUN пакет java.sql.*; и его спецификация JDBC представляют исчерпы­вающие средства для Java-приложений. API SQLJ является дополнени­ем или скорее хорошей альтернативой в случае формирования стати­стических запросов, поставляется обычно производителями баз данных, поддерживающими SQLJ-стандарт, IBM, Oracle и др.
SQLJ — технология, позволяющая включать SQL-операторы, непо-
средственно в программы, написанные на языке Java.
С помощью SQLJ можно использовать следующие стандартные опе-
рации, выполняемые в обычной программе, написанной на SQL:
Запрос: SELECT оператор и выражения.
Операторы манипулировали данными (DML): INSERT, UPDATE, DELETE.
Операторы данных: FETCH, SELECT... INTO.
Операторы контроля транзакций: COMMIT, ROLLBACK и т. д.
Операторы определения данных (DDL): CREATE, DROP и т. д.
Вызов хранимых процедур: CALL MYPROC(:x,:y,:z)
Вызов хранимых функций: VALUES(MYFUN(:x) )
Управление сессией.
SQLJ представляет собой легкий способ встраивать SQL-операторы
непосредственно в Java-программы он более краток, лаконичен, чем JDBC. Однако использование SQLJ не отрицает использования части API JDBC, так как при обращении к базе данных SQLJ может исполь­зовать класс драйвер и методы обработки ошибок базы данных, реали­зованные в классах пакетов JDBC .sqlj-программы значительно меньше программ, использующих динамически SQL, а значит, и существенно быстрее.
Классы SQLJ не входят ни в стандартный набор JAVA API, ни в на-
бор API уровня предприятия (J2EE), предлагаемых компанией SUN. Па­кеты по созданию и работе с SQLJ-файлами обычно распространяются
252 Часть 5. Работа с базами данных при помощи Java
производителями СУБД. Компания IBM включает в поставку базы дан­ных DB2, архивы для работы с SQLJ, обычно они находятся в каталоге java, системного каталога DB2. Различные производители СУБД постав­ляют собственные версии SQLJ-трансляторов и системного окружения.
Существуют также пакеты сторонних поставщиков для работы с ба-
зами данных, использующие технологии JDBC и SQLJ. Основной стан­дарт SQLJ поддерживает стандарт SQL92, о поддержке специфических диалектов SQL непосредственно указано в документации производите­ля SQLJ-транслятора. Транслятор IBM один из первых, полностью от­вечающих стандарту SQLJ. На настоящий момент IBM поставляет свой транслятор с продуктами Visaul Age for Java(VAJ) версии 3 и выше и DB2 (UDB) версии 6.1.
Глава 35. Инсталляция и импортирование пакетов для разработки SQLJ-приложений
Как и со всеми Java-классами, классы по работе с SQLJ обязательно
надо включить в системную переменную CLASSPATH.
Компания IBM поставляет набор разработчика (SDK) c пакетами
классов, необходимых SQLJ-приложениям. В SDK для DB2 данные па­кеты представлены в виде отдельных zip-архивов, в IDE VisualAge классы добавляются в репозиторий. О работе в среде VisualAge с SQLJ­приложениями будет сказано в отдельной главе. Например, для работы с базой данных DB2 необходимо поместить следующие архивы, содер­жащие необходимые классы в системную переменную CLASSPATH:
db2java.zip
Архив с классами драйверов для доступа к базам данных SQLJ клас-
сы, включая классы хранимых процедур и User Definded Function (UDF), а также типы, описывающие большие объекты SQL, такие, как LOB, CLOB, BLOB и т. д.
sqlj.zip
В этом файле содержатся классы SQLJ транслятора. В основном в
этом архиве содержится служебная информация по созданию и транс­ляции SQLJ файлов.
runtime.zip
Данный архив содержит основные пакеты для работы SQLJ прило-
жений.
Приложения которые работают с базами данных, в частности SQLJ
приложения, должны обязательно импортировать следующие пакеты:
java.sql.*
JDBC API, поставляемый в JDK. Этот пакет является обязательным
при разработке приложений, работающих с базами данных, но может не использоваться при создании SQLJ-файла. Однако некоторые классы
Часть 5. Работа с базами данных при помощи Java 253
широко используются SQLJ-приложениями, например, по обработке вре­менных данных типа DATE, TIME, TIMESTAMP, обработке SQL ошибоч­ных ситуаций и работе с некоторыми методами класса DriverManager.
sqlj.runtime.*
Данный пакет используется, если приложение имеет встроенные
SQL-операторы, и предполагается использовать SQLJ-программу. Дан­ный пакет предназначен для работы SQLJ-приложения во время вы­полнения. Добавочные пакеты импортируются при необходимости и определяются логикой приложений.
Компания IBM поставляет добавочный пакет COM.ibm.db2.sqlj, в ко-
тором содержаться классы локализации сообщений SQLJ-транслятора.
Основную информацию об использовании SQLJ в базе данных DB2
компании IBM можно получить ïî адресу: http://www.softwa­re.ibm.com/data/db2/java/sqlj
Глава 36. Основные компоненты и схема работы SQLJ-транслятора
Технология SQLJ состоит из трех компонентов:
транслятор — преобразует .sqlj-файл в java-файл или исполняе-
мый класс;
окружение во время выполнения (runtime) SQLJ, вызывается авто­матически при загрузке программы;
встроенные sqlj — непосредственно SQL-операторы, встроенные в Java-программу.
В пакет разработчика (SDK) для DB2 фирма IBM включила допол-
нительные компоненты разработки программ с использованием SQLJ, а также утилиту db2profc, предназначенную для определения и исполь­зования пользовательских профилей. Для возможности вывода на пе­чать поставляется другая программа db2profp, печатающая созданный пользовательский профиль как обычный текст, также имеется конвер­тер преобразования .ser файлов в байт-код-profconv.
Работа с Java-кодом, имеющим встроенные SQL-операторы в прило-
жении, проходит так же, как и для других языков используемых для программирования — ADA, С++, С и пр. Главная идея встроенных SQL-операторов состоит в непосредственном объединении языка SQL и базового языка. Симбиоз основан на следующих принципах (рис. 5.1).
Создается исходный файл, содержащий операторы двух языков, в
данном контексте Java и SQL. Созданный файл обрабатывается специа­льной программой. Раньше это был препроцессор, теперь он называется транслятором. Sqlj-транслятор просматривает исходный текст програм­мы и обрабатывает обнаруженные SQL-операторы. Использование пере­менных позволяет присваивать результаты SQL-запросов встроенным переменным базового языка. На данном этапе практически одновремен­но выполняются несколько действий. Синтаксические анализаторы, один для SQL, другой для Java, проводят проверку операторов. Здесь же про-
254 Часть 5. Работа с базами данных при помощи Java
Рис. 5.1. Схема работы SQLJ-транслятора
водится проверка параметров операторов и оптимизация, эта работа вы­полняется базой данных. Далее транслятором создается несколько раз­личных файлов, содержащих отдельно операторы SQL и базового языка, в данном случае языка Java. Один из созданных транслятором файлов описывает пользовательские данные, обеспечивающие соединение с ба­зой данных. После использования компилятора основного языка, гово­рим о Java, создается готовое приложение. В данный момент у приложе­ния отсутствует какое-либо обращение к базе данных. После похожде­ния первичных этапов SQLJ выступает â ðîëè компоновщика, совмещающего SQL-операторы и Java-код в одно готовое приложение.
36.1 SQLJ транслятор
Внешне SQLJ-транслятор представляет собой исполняемый файл -
sqlj.exe для систем Windows с определенным перечнем ключей коман­дной строки .sqlj-транслятор формирует из .sqlj-файла либо. java-файла готовый к трансляции, либо уже откомпилированный байт-код. Сначала транслятор проводит синтаксический анализ при помощи стандартного Java синтаксического анализатора, затем SQLJ-транслятор вызывает собственный анализатор при проверке SQL-конструкций. На данном этапе проводится проверка соответствия Java-типов и импортирован­ных классов sqlj-файла, тут же проводится проверка встроенных SQL­операторов манипулирования данными (SELECT, INSERT, DELETE, UPDATE и др.). Если проверка первых двух этапов прошла успешно, SQLJ-транслятор проверяет правильность работы всех SQL-операто­ров. Проверка во время компиляции может осуществляться как SQLJ­транслятором, так и Java-компилятором во время создания .class-файла из созданного транслятором .java-файла. Транслятор также проверяет правильность запросов к базе данных во время трансляции: Когда
Часть 5. Работа с базами данных при помощи Java 255
SQLJ-приложение запускается, SQLJ во время выполнения считывает профили или создает «профили соединения» для доступа к данным, на­ходящимся в базе данных. Транслятор производит один .java-файл и еще один или несколько файлов SQLJ-профилей, содержащих инфор­мацию о SQL-операторах, после профили будут добавлены в основной класс. Профили содержат информацию о SQL-данных и правила досту­па к ним. Транслятор по умолчанию сохраняет профили, создавая как файлы с расширением .ser, имя которых будет соответствовать имени созданного java-файла, плюс знак подчеркивания и слова Prоfile1, Pro­file2 и т. д. Используя опцию транслятора ser2class, можно преобразо­вать профили в обычный .class-файл. Данная функция очень полезна при работе с Web-браузерами, не поддерживающими файлы с расши­рением .ser. При такой ситуации можно получить сообщение
java.lang.ClassNotFoundException: myAppl_SJProfile0
Для предотвращения подобной ситуации необходимо преобразовать
.ser-файл в обычный java-класс, используя опции ключей транслятора или специальные утилиты, поставляемые разработчиками как Java­компиляторов, так и SQLJ-трансляторов.
В пакете sqlj.runtime.profile.util. содержится утилита SerProfileToC-
lass, которая создает класс, содержащий профиль. Для того чтобы вос­пользоваться данной утилитой, необходимо в командной строке набрать следующие, с указанием .ser, файлы
java sqlj.runtime.profile.util.serProfileToClass Applt_SJProfile0.ser
или же воспользоваться утилитой конвертации, также поставляемой фирмой IBM в инструментарии разработчика (SDK).
profconv Applt_SJProfile0.ser
В том и другом случае будет создан класс Applt_SJProfile0.class, в
котором будут храниться все данные профиля.
Транслятор SQLJ — основной инструмент по созданию SQLJ-прило-
жений. Обладая достаточной гибкостью и мощностью, SQLJ-транслятор позволяет также компилировать созданный .java-файл в исполняемый байт-код. Выбор режима трансляции устанавливается в командной строке и зависит от ключей, заданных при трансляции. Для полного пе­речня ключей SQLJ-транслятора необходимо в командной строке на­брать sqlj с опцией help-long,
sqlj –help-long >c:\helpsqlj.txt
Ключи, используемые при трансляции SQLJ-приложения, необходи-
мы для организации доступа к конкретной базе данных. Для предотвра­щения использования в командной строке одних и тех же операций, можно создать простой текстовой файл sqlj.properties, содержащий определеные текстовые значения. Для SQLJ-транслятора, поставляемо­го фирмой IBM в составе DB2, следующие пары клей=значений:
sqlj.url=jdbc:db2:dbname sqlj.driver=COM.ibm.db2.jdbc.app.DB2Driver
256 Часть 5. Работа с базами данных при помощи Java
sqlj.online=sqlj.semantics.JdbcChecker sqlj.offline=sqlj.semantics.OfflineChecker
В 1-й строке значение dbname указывает имя используемой базы
данных. Этот же параметр в командной строке вызывается через атри­бут –url.
sqlj -url=jdbc:db2:sample MyClassSqlj.sqlj
Именно это значение можно будет в дальнейшем использовать во
встроенном объекте ConnectionContext. Строка jbdc:db2:sample описы­вает стандартный способ доступа к базе данных. Первым указывается используемый интерфейс, не надо путать набором API, в других прило­жениях этот параметр может иметь значение odbc. Далее указывается используемая база данных, в данном случае DB2, и, наконец, название самой базы данных — sample. Во 2-й строке указывается имя драйвера базы данных. Драйвер COM.ibm.db2.jdbc.app.DB2Driver предназначен для работы локального по отношению к базе данных приложения. Заме­нив app в указанной строчке на net, можно получить сетевой драйвер доступа к DB2.
3-я и 4-я строки указывают необходимость проверки SQL-операто-
ров в момент трансляции.
Для того чтобы SQLJ-транслятор смог воспользоваться значениями,
описанными в файле свойств, в командной строке sqlj.properties исполь­зуется атрибут pros c указанием полного пути к файлу свойств.
Соответственно для других баз данных будут использоваться отлич-
ные от приведенных значения или же необходимые параметры должны быть описаны в SQLJ приложении. Без использования файла свойств и транслирования созданного SQLJ файла из командной строки, разра­ботчик будет обязан вводить параметры соединения с базой данный каждый раз в командной стоке
sqlj -url=jdbc:db2:sample driver=COM.ibm.db2.jdbc.app.DB2Driver MyClass­Sqlj.sqlj
По умолчанию транслятор SQLJ превращает исходный .sqlj-файл
сразу в готовый к выполнению байт-код Java. Если будет необходимо впоследствии изменить создаваемое приложение, надо принудительно отключить компиляцию в байт-код, в командной строке добавляется следующий атрибут —compile=false.
sqlj -compile=false MyClassSqlj.sqlj
При создании SQLJ-приложения может потребоваться использова-
ние уже существующих серилизованных файлов от предыдущей транс­ляции, содержащих параметры доступа, ключ d (directory) указывает расположение файлов.
После успешного создания вызов SQLJ-приложения подобен вызову
обычного Java-приложения.
java MyClassSqlj.class
Часть 5. Работа с базами данных при помощи Java 257
36.2 Среда выполнения SQLJ
SQLJ Runtime-пакеты необходимы для выполнения SQLJ-программ.
Наличие классов из данных пакетов указывает на SQLJ-приложение и возможность получения из этого приложения доступа к базе данных, а также обработки SQLJ-транслятором создаваемого приложения.
Пакет sqlj.runtime содержит классы и интерфейсы системных объек-
тов, указываемых в SQLJ-коде .sqlj.runtime.ref — основной пакет, чьи классы и интерфейсы представляют тот самый набор объектов, благо­даря которым разработчик создает SQLJ-приложение. Класс .Default­Context описывает объект, содержащий значения по умолчанию для со­здания соединения с базой данных. По работе с потоком определены три класса AsciiStream, UnicodeStream и BinaryStream. В пакете также описаны два важных интерфейса NamedIterator, PositionIterator. При посредничестве объекта класса ExecutionContext разработчик получает данные о выполняемом SQL-операторе. Перечисленные классы и интер­фейсы и объекты, созданные на их основе, будут обсуждаться в даль­нейшем.
Пакет sqlj.runtime.profile. В этом пакете имеется несколько абстрак-
тных классов, таких как EntryInfo и TypeInfo, описывающие типы па­раметров, сохраненных в профилях. На объекты, порожденные от ин­терфейсов RTResultSet и Rtstatment, транслятор опирается при созда­нии профилей. Другие классы и интерфейсы необходимы для работы с пользовательскими профилями, созданными SQLJ-транслятором. Опи­сываются профили приложений и типы параметров .sqlj-профили обычно серилизованные объекты Java, созданные SQLJ-транслятором и содержащие детали о встроенных SQL-операторах. Обычно классы данного пакета не используются разработчиком, а в большей степени предназначены для правильного формирования профилей транслято­ром.
Пакет sqlj.runtime.profile.ref. В этом пакете находятся наследники
классов и интерфейсов из пакета sqlj.runtime.profile по работе с пользо­вательскими профилями. Обработчики и значения, принятые по умол­чанию для профилей транслятора. Некоторые классы используются для описания JDBC-типов данных SQLJ-приложений. Служебная информа­ция, описанная с помощью классов данного пакета, используется транс­лятором для правильной трансляции Java-кода и пользовательских профилей.
Пакет sqlj.runtime.profile.util содержит утилиты классов, используе-
мые для доступа и манипулирования профилями.
Пакет sqlj.runtime.error содержит классы ошибок, возникающих при
выполнении кода SQLJ-транслятором, также содержит большое коли­чество классов по локализации системных ошибок. Определяет три ви­да ошибок: ошибки SQLJ-трансляции, ошибки JDBC-драйвера, ошибки базы данных. В любом из этих случаев создается объект класса ja­va.sql.SQLException. Методы данного объекта getSQLState(), getErrorCo­de() и getMessage() позволяют получить числовое значение кода ошиб­ки, сообщение и сообщения состояния.
258 Часть 5. Работа с базами данных при помощи Java
Пакет sqlj.runtime.ref содержит классы для различных входящих па-
раметров выполнения, не представляет особого интереса для разработ­чика SQLJ-программ.
36.3. Создание и планирование SQLJ-приложения
SQLJ может использоваться для создания трех различных типов
объектов, определяющих работу с базой данных:
Исполняемые SQL команды, наиболее часто встречаемые операции
по работе с данными. Практически любое SQLJ-приложение создается именно для манипулирования данными.
Определение соединения с базой данных. Чтобы данными манипули-
ровать, необходим объект, описывающий соединение с конкретной ба­зой данных. С другой стороны, кроме знаний о пользователе необходимо знать и о SQL-запросе, созданном пользователем.
Создание итератора
Таблицы — объекты остаточно емкие, и построчное выполнение
SQL-запроса приводит к ненужному коду в теле программы. Чтобы из­бежать повторных операторов, выполняющих одни и те же действия, используется iterator.
Для создания SQLJ-файла можно, как обычно, воспользоваться ка-
ким-нибудь текстовым редактором без знаков форматирования, напри­мер, Notepad, но все же для избежания многочисленных ошибок проще использовать специальные инструменты, такие, как VisualAge for Java (VAJ) или Stored Procedure Builder (SPB), поставляемого вместе с DB2 фирмы IBM. Созданию SQLJ-приложений при помощи средств IBM по­священа отдельная глава. DB2 SQLJ и встроенный транслятор в Visual Age for Java оба поддерживают основной стандарт SQLJ ANSI. В про­тивном случае может потребоваться, кроме транслятора, еще пара ин­струментов, отладчик и Java-загрузчик, для тестирования и проверки созданного SQLJ-приложения.
1. В текстовом редакторе создается новый файл.
2. Затем добавляются Java-операторы, SQL-операторы и синтаксиче-
ские SQLJ-конструкции.
3. Созданный файл сохраняется с расширением .sqlj.
4. Из командной строки вызывается транслятор с параметрами до-
ступа к базе данных. Созданный файл преобразуется SQLJ-транслято­ром и после успешной трансляции компилируется либо самим трансля­тором, либо Java-компилятором, поставляемым в стандартном JDK, или другими Java-компиляторами.
Каждый SQLJ-оператор начинается со знака диеза (#), #sql указы-
вает на начало выполняемого SQL-оператора, а непосредственно SQL­запрос заключается в фигурные скобки, заканчивающиеся точкой с за­пятой, потому что это все-таки Java-оператор. Транслятор самостояте­льно проверит правильность оформления оператора.
Нижеследующий пример не несет смысловой нагрузки, а предназна-
чен для иллюстрации встроенных SQL-операторов.
Часть 5. Работа с базами данных при помощи Java 259
#sql x={SELECT ename INTO:name FROM emp WHERE empno=:id AND sal>:salary}; #sql {DELETE FROM table WHERE empno=>:id };
#sql { BEGIN INSERT INTO table (col1, col2) VALUES(«NAME», 1999 );SELECT* FROM table;END };
В 1-й строке внешней переменной x присваивается значение SQL-
запроса. Во 2-й строке выполняется операция удаления стандартным SQL-оператором DELETE. В 3-й строке создается процедура, ключевые слова BEGIN и END.
Правила составления SQLJ-операторов ничем не отличаются от пра-
вил созданий SQL-операторов, только необходимо учесть разницу в ин­терпретации значений null. Во-первых, стандартное значение Null в SQL не эквивалентно значению Null в языке Java. Во-вторых, оба языка по­разному обрабатывают регистрозависимые значения. В SQL null, Null и NULL, одно и то же значение, в то время как в Java это разные значе­ния. Также необходимо учитывать специфику работы с разными типами данных у разных производителей СУБД. Некоторые числовые, а также временные типы данных по-разному описываются в разных базах дан­ных, а иногда и в разных версиях одного производителя. Кроме сущест­вующего стандарта языка SQL, некоторые производители расширили стандарт своими собственными диалектами языка SQL. Для того чтобы полностью избежать неприятностей, в дальнейшем рекомендуется ис­пользовать чистый стандарт SQL. И тогда принцип: Написанный однаж­ды работает везде, можно будет применить и к SQLJ-приложениям.
Аргументы встроенных SQL-операторов, являющихся Java-перемен-
ными, имеют префикс двоеточие (:):
#sql x={SELECT ename INTO :name FROM emp WHERE empno=:id AND sal>:salary};
В указанном SQLJ-операторе содержатся три Java-переменных: :na-
me, :id, :salary. Как и в каждом Java-приложении, поле (переменная) должно описываться раньше, чем использоваться; это значит, что строчке, приведенной выше, предшествует строка с инициализацией Java-переменных. Сначала предлагаем, потом занимаемся.
void m (int x, String y, float z) throws SQLException { #sql { INSERT INTO TAB1 VALUES (:x, :y, :z) }; }
Перед каждой встроенной переменной можно указать ее тип IN —
входящая, т. е. передаваемая в SQL-запрос, точнее, в базу данных, OUT — значения выводятся из запроса в программу, INOUT — комби­нированная.
#sql {UPDATE emp SET sal=:IN salary WHERE ename=:IN name };
По умолчанию тип всех передаваемых переменных соответствует
входящему IN, но если тип переменной обязательно необходимо ука­зать, то :IN должен предшествовать передаваемой переменной.
260 Часть 5. Работа с базами данных при помощи Java
При совместном использовании Java- и SQL-выражений, первыми
всегда выполняются Java операторы, используемые в SQLJ-приложе­ниях.
#sql {SELECT ACTDESC INTO :hvactdsc WHERE ACTNO=:(x++)};
В данном запросе переменой :x присваивается определенное значе-
ние, затем выполняется SQL-оператор.
Основное, что следует учитывать при указании типа переменной, —
соответствие выполняемой работе. Переменные типа OUT выполняются только с операторами SELECT и не могут использоваться с оператора­ми INSERT, DELETE, UPDATE, поскольку результатом последних SQL-операторов является пустое значение или ничего.
Знак двоеточия имеет разные значения в Java и SQL, об этом нельзя
забывать при создании SQLJ-приложения.
import java.sql.*; import sqlj.runtime.ref.*; import sqlj.runtime.*; #sql iterator MyIter (String ename, int empno, float sal); public class MyExample { public static void main (String args[]) throws SQLException { DefaultContext.getConnection («jdbc:db2:sample», «login», «pwd»); #sql { INSERT INTO emp (ename, empno, sal) VALUES ('MAN', 32, 20) }; MyIter iter; #sql iter={SELECT ename, empno, sal FROM emp }; while (iter. next()) { System.out.println(iter. ename()+" «>+iter. empno()+» «+iter. sal() } }}
1, 2 и 3-я строки определяют импортированные классы по созданию
SQLJ-приложения. Именно благодаря импортированным классам при­ложение приобретает все свойства SQLJ-программы. 4-я строка содер­жит встроенный объект, именованный iterator, о нем будет сказано ни­же. В 5-й строке определяется создаваемый класс. Метод main(), 6-я строка, указывает на то, что создаваемое приложение будет програм­мой, а не апплетом или servlet. В 7-й строке используется еще один встроенный объект с параметрами соединения пользователя с базой данных. Существует другой способ инициализации пользовательского соединения, используемый по умолчанию, но об этой возможности бу­дет сказано ниже. Первый понятный SQLJ-оператор указан в 8-й стро­ке. Выполняется обычная операция добавления значений в исходную таблицу. В 9-й строке создается объект, порожденный от встроенного объекта, указанного в 4-й строке. В 10, 11, 12-й строках выводятся все значения, выполненные оператором SELECT.
Обычные SQLJ-приложения могут работать без использования до-
полнительных пакетов JDBC, таких, как java.sql.*. Но для организации соединения с базой данных используется объект класса Connection и часть его методов:
clearWarnings()
close()