Ульяновский государственный университет
Опубликован: 10.09.2004 | Доступ: свободный | Студентов: 29344 / 2440 | Оценка: 4.06 / 3.65 | Длительность: 16:19:00
ISBN: 978-5-9556-0101-4
Лекция 18:

Внедрение SQL-операторов в прикладные программы

< Лекция 17 || Лекция 18: 1234

Взаимодействие с базой данных в Java-программах

Извлечение и обработка информации из базы данных в общем случае связаны с решением следующих задач:

  • подключение / отключение базы данных;
  • запуск, фиксация и откат SQL-транзакций;
  • отображение результатов SQL-запроса;
  • создание обновляемых курсоров для просмотра, вставки, удаления и изменения данных;
  • доступ к большим бинарным объектам с мультимедиа-содержимым.

В качестве примера организации доступа к базе данных из прикладных программ рассмотрим:

  • взаимодействие с базой данных в Java-программах;
  • обращение к базе данных из языков сценариев с использованием технологии ADO.

Java-программа может быть специализирована для работы с внешними базами данных. С этой целью в Java включены классы для доступа к БД (java.sql.*).

Взаимодействие Java-программы с внешним сервером баз данных осуществляется посредством специализированного протокола, отвечающего за совместимость Java с базами данных ( Java Database Connectivity, JDBC ). Он построен на принципах интерфейса ODBC и применяется для стандартизации Java-кода при организации доступа к различным СУБД. Созданный вслед за спецификацией ODBC, пакет JDBC стал одним из методов доступа к реляционным СУБД из Java-программ. Протокол JDBC, по сути, является посредником Java-кода и драйвером ODBC.

Этап подключения к базе данных включает загрузку драйвера и создание соединения.

Загрузка драйвера

Конкретная база данных обычно доступна с помощью одного или нескольких драйверов. Составная часть JDBC - драйвер для доступа из JDBC к источникам данных ODBC. Этот драйвер называется программой сопряжения JDBC-ODBC и реализован в виде JdbcOdbc.class.

Поскольку JDBC конструктивно близок к ODBC, программа сопряжения представляет собой надстройку над JDBC. На внутреннем уровне этот драйвер отображает методы Java в вызовы ODBC и тем самым взаимодействует с любым ODBC-драйвером. Достоинство такой программы сопряжения состоит в том, что JDBC имеет доступ к любым базам данных, поскольку ODBC-драйверы распространены очень широко. Драйвер JDBC-ODBC является мост-драйвером, т.к. создает мост между JDBC и другим интерфейсом уровня обращения (Call Level Interface, CLI). Он обрабатывает обращения JDBC и, в свою очередь, вызывает функции ODBC, которые передают запросы SQL источнику данных ODBC. Драйвер JDBC-ODBC загружается командой:

Class.forName(
   "com.ms.jdbc.odbc.JdbcOdbcDriver");

Создание соединения: класс Connection

Класс DriverManager - самый верхний в иерархии классов. Он отслеживает информацию о драйвере, о состоянии, регистрирует драйвер в процессе его загрузки и т.д. Когда требуется установить связь, этот класс выбирает драйвер в зависимости от URL JDBC.

Создать соединение с источником данных можно с помощью метода getConnection класса DriverManager.

Для задания источника данных используются соглашения по присвоению имен URL. В соответствии с правилами Internet, JDBC идентифицирует базу данных при помощи URL, который имеет следующую форму:

jdbc:<субпротокол>:<имя, связанное с 
    СУБД или протоколом>

Имя субпротокола odbc зарезервировано для источника данных формата ODBC. Типичный JDBC URL для БД ODBC выглядит следующим образом:

jdbc:odbc:<DSN-имя ODBC>; 
    user=<имя пользователя>;pw=<пароль>

Класс Connection ( соединение ) - один из самых важных в JDBC. Он предоставляет широкий спектр возможностей: от создания операторов до обработки транзакций. Объект Connection управляет всеми аспектами установки связи. Фактически, Connection - это класс, ведущий к драйверу СУБД. Успешно создав объект Connection для источника данных, программист может взаимодействовать с источниками самыми разными способами. Наиболее распространенный подход состоит в том, чтобы объекты управляли SQL-операторами.

В JDBC имеется три основных типа объектов для операторов:

  • Statement ;
  • PreparedStatement ;
  • CallableStatement.

Оператор SQL может быть выполнен немедленно ( Statement ), откомпилирован ( PreparedStatement ), представлен в виде вызова процедур ( CallableStatement ).

Для создания этих объектов класс Connection предлагает, соответственно, три метода:

  • createStatement() ;
  • prepareStatement(String sql) ;
  • prepareCall(String sql).

Создание оператора: класс Statement

Объект Statement создается методом createStatement() из объекта Connection и лучше всего подходит для SQL-операторов, выполняемых один раз.

Когда запрос возвращает обычные строки данных, для выполнения SQL-оператора необходимо использовать метод executeQuery(String sql). В таком случае запрос - это статический SQL-запрос выборки SELECT. Метод executeQuery(String sql) принимает строку SQL, передает ее источнику данных через диспетчер драйверов, получает набор результатов и возвращает его прикладной программе. Метод возвращает только один набор результатов типа ResultSet. Если необходимо возвращать несколько наборов данных, применяется метод execute(String sql).

Для SQL-операторов, не возвращающих наборы результатов (например UPDATE, DELETE и INSERT ), объект Statement применяет метод executeUpdate(String sql), который берет строку SQL и возвращает целое. Это целое указывает количество строк, обработанных оператором SQL.

Получение результатов: класс ResultSet

Объект ResultSet, представляющий набор результатов, фактически является табличным набором данных, т.е. состоит из рядов данных, организованных в унифицированные столбцы. Программа на языке Java, использующая JDBC, единовременно способна выдать только один ряд данных. Чтобы перейти к следующему ряду, она должна вызвать метод next(). JDBC не предоставляет метод для обратного движения по ResultSet или запоминания рядов ("закладки" в ODBC). Получив ряд, программа может пользоваться позиционным указателем (1 - для первого столбца, 2 - для второго и т.д.) или названием столбца и получить значение поля, вызвав метод getXXXX ( getInt, getByte, getString и т.д.) в соответствии с типом возвращаемых данных.

Class.forName(
  "com.ms.jdbc.odbc.JdbcOdbcDriver");
// при создании соединения указывается 
// DSN источника данных (mystud),
// имя пользователя (user1), его пароль(123)
  Connection myCon=DriverManager.getConnection
  ("jdbc:odbc:mystud","user1","123");
  Statement mySt=myCon.createStatement();
  ResultSet rs=mySt.executeQuery(
    "SELECT название, тип, цена FROM товар");
    while (rs.next())  {         
          String var1=rs.getString(1);
          String var2=rs.getString(2);
          int var3=rs.getInt(3);
// значения переменных var1, var2, var3 могут 
// далее быть использованы в элементах 
// пользовательского графического интерфейса
    }
18.1. Выполнение статического SQL-запроса к учебной базе данных из Java-программы.

Создание оператора: класс PreparedStatement

В случае использования этого объекта программа подготавливает SQL-оператор при помощи метода prepareStatement (String sql) объекта Connection: берется SQL-строка и передается СУБД. Строка проходит через стадии синтаксического анализа, оптимизации и генерирования плана выполнения, но не выполняет оператор SQL. Ссылка на план выполнения возвращается JDBC, который сохраняет ее в объекте PreparedStatement.

Одно из важных свойств метода prepareStatement - возможность обработки входных параметров. Они помечаются в операторе SQL символом "?" на месте фактического значения. В программе Java проводится соответствие между параметрами и методами setXXXX() - setInt, setFloat, setString и т.д., в соответствии с типами входных параметров. Все методы setXXXX() принимают в качестве параметров значение параметра и указатель parameterIndex, который равен 1 для первого "?", 2 - для второго и т.д. Выполнение sql-оператора обеспечивается методами объекта PreparedStatement:

  • executeQuery() - для выполнения запроса выборки SELECT ;
  • execute() - для выполнения запроса, возвращающего множественные наборы данных ;
  • executeUpdate() - для выполнения запроса модификации данных INSERT, UPDATE или DELETE.

Объект PreparedStatement обеспечивает более быстрое выполнение оператора SQL и является примером реализации динамического SQL.

Class.forName(
    "com.ms.jdbc.odbc.JdbcOdbcDriver");
Connection myCon=DriverManager.getConnection
    ("jdbc:odbc:mystud","user1","123");
PreparedStatement mySt=myCon.prepareStatement
    ("INSERT товар(название, тип, цена) 
    VALUES(?,?,?)");
mySt.setString(1, "Трюфели");
mySt.setString(2, "Конфеты");
mySt.setInt(3,156);
int res=mySt.executeUpdate();
18.2. Выполнение динамического SQL-запроса к учебной базе данных из Java-программы.
< Лекция 17 || Лекция 18: 1234
Анатолий Ганицкий
Анатолий Ганицкий

Подскажите, пожалуйста, куда обрщаться если в предложенном мне вопросе теста из 4 вариантов нет ни одного правильного?

Я пробовал ставить комментарий к вопросу через кнопку "Прокомментировать", но похоже что эти комментарии кто-нибудь будет читать в лучшем случае лет через 100...

Дарья Федотова
Дарья Федотова
Анатолий Федоров
Анатолий Федоров
Россия, Москва, Московский государственный университет им. М. В. Ломоносова, 1989
Сергей Пантелеев
Сергей Пантелеев
Россия, Москва