Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:JAVA. Серверные приложения
.pdf
Часть 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.software.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, Profile2 и т. д. Используя опцию транслятора 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 MyClassSqlj.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-приложение. Класс .DefaultContext описывает объект, содержащий значения по умолчанию для создания соединения с базой данных. По работе с потоком определены
три класса 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-драйвера, ошибки
базы данных. В любом из этих случаев создается объект класса java.sql.SQLException. Методы данного объекта getSQLState(), getErrorCode() и 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()
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
