logo
5 модуль

17.4. Доступ к базам данных из Java

Java Database Connectivity (JDBC) — технология взаимодействия языка Java с базами данных, включает в себя API для разработки клиентских приложений и для разработки драйверов баз данных (специализированных библиотек для работы с конкретной СУБД).

JDBC API состоит из пакетов java.sql и javax.sql, в данном параграфе рассматривается только пакет java.sql. На схеме ниже изображена архитектура взаимодействия с базой данных через JDBC:

Таким образом, код работы с базой данных из приложения становится универсальным, а для перехода на базу данных другого производителя требуется лишь заменить драйвер (если не брать во внимание возможные нестыковки в SQL-запросах, о чем говорилось выше).

Некоторые важные классы пакета java.sql:

Общая схема работы с базой данных через JDBC следующая:

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

Загружается драйвер базы данных, т. е. принудительно вызывается загрузка класса драйвера в память Java-машины (класс для этого должен быть «виден» Java):

// загружаем драйвер MySQL Connector/J

Class.forName("com.mysql.jdbc.Driver");

Он самостоятельно регистрируется в списке доступных драйверов посредством вызова метода DriverManager.registerDriver и после этого может быть использован для установления соединения.

2. Соединение с СУБД

Устанавливается соединение к базе данных, для чего вызывается метод getConnection класса DriverManager с параметрами соединения:

Connection con = DriverManager.getConnection(URL, USER, PASSWORD);

URL — строка соединения, конкретный вид которой зависит от используемого драйвера и может быть найден в документации к нему. Например, строка соединения для драйвера MySQL Connector/J имеет вид: "jdbc:mysql://example.org:3306/test" (означает, что сервер базы данных запущен на машине с доменным именем example.org, на порту 3306, а имя базы данных — test).

USER — имя пользователя, который имеет права на доступ к базе.

PASSWORD — пароль пользователя.

3. Создание объекта-запроса

Инициализируется объект-запрос, для чего используется соответствующий метод createStatement или prepareStatement класса Connection:

PreparedStatement st = con.prepareStatement(

"insert into student (last_name, first_name) values (?, ?)");

Метод prepareStatement принимает строку с SQL-оператором. Знаки вопроса означают параметры, которые необходимо установить перед выполнением оператора.

4. Инициализация параметров запроса

Устанавливаются параметры, если этого требует SQL-оператор:

st.setInt(1, "Иванов");

st.setString(2, "Иван");

5. Выполнение оператора

Если SQL-оператор не предполагает возвращение результата, вызывается метод executeUpdate:

st.executeUpdate();

Если SQL-оператор возвращает набор строк (оператор SELECT), используется метод executeQuery:

ResultSet rs = st.executeQuery();

Объект rs содержит полученные данные и различные методы для доступа к ним, например:

while (rs.next()) { // переходим на следующую запись

Integer i = rs.getInt(1); // получаем первое значение

String s = rs.getString(2); // получаем второе значение

}

6. Завершение работы с СУБД

Все объекты, создаваемые для работы с базой данных, закрываются.

st.close();

con.close();

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

Все вышеперечисленные операции могут вызвать исключение SQLException, поэтому для грамотной обработки иключительных ситуаций они помещаются в блок try-catch.