JAVA-ТЕХНОЛОГИЯ
Сафонов Владимир Олегович
Профессор кафедры информатики,
руководитель лаборатории Javaтехнологии
(http://polyhimnie.math.spbu.ru/jtl)
Email: vosafonov@gmail.com
Лекция 20
JDBC
JDBC
Летом 1996 года компания Sun выпустила
первую версию интерфейса для организации
доступа Java-приложений к базам данных - JDBC
(Java Data Base Connectivity)
Набор интерфейсов и классов составляет пакет
java.sql, входящий в JSE. Имеется также пакет
javax.sql – поддержка серверных возможностей
Интерфейс позволяет соединяться с базой
данных, запрашивать и обновлять данные с
помощью языка структурированных запросов
(Structured Query Language - SQL)
Sun также разработала собственную открытую
СУБД - MySQL
(C) В.О. Сафонов. 2013
Драйвер JDBC
Кроме классов с методами доступа к
базе данных, для каждой необходим
драйвер JDBC – промежуточная
программа, реализующая методы
JDBC
Загрузка и выгрузка таких драйверов
осуществляется с помощью класса
DriverManager.
(C) В.О. Сафонов. 2013
Драйвер JDBC
(C) В.О. Сафонов. 2013
Типы драйверов
Существует 4 типа драйверов JDBC:
1. Драйвер, реализующий методы
JDBC вызовами функций ODBC (Open
DataBase Connectivity). Sun включила в
состав JDK один из таких драйверов –
“мост” JDBC/ODBC
(C) В.О. Сафонов. 2013
Пример загрузки
драйвера
try {
Class joDriver =
sun.odbc.JdbcOdbcDriver.class;
}
catch(ClassNotFoundException e) {
System.err.println(
"JDBC/ODBC driver not found");
}
(C) В.О. Сафонов. 2013
Пример загрузки
драйвера
Драйвер также можно
зарегистрировать вручную, загрузив
его класс.
Class.forName("oracle.jdbc.driver.OracleDriver");
Такой подход применяется, если
диспетчер не может загрузить
драйвер.
(C) В.О. Сафонов. 2013
Типы драйверов
2. Драйвер, реализующий методы JDBC
вызовами функций API (Application
Programming Interfaces) самой базы данных.
3. Драйвер, реализующий методы JDBC
вызовами функций сетевого протокола,
независимого от базы данных
4. Драйвер, реализующий методы JDBC
вызовами функций сетевого протокола
базы, т.е. транслирующий JDBC-запросы
непосредственно в протокол конкретной
базы данных
(C) В.О. Сафонов. 2013
SQL
SQL - универсальный язык,
применяемый для создания,
модификации и управления данными
в базах данных.
Главное преимущество –
независимость от конкретной базы
данных.
Пакет JDBC можно рассматривать как
API для взаимодействия
с
SQL
(C) В.О. Сафонов. 2013
командами доступа к базе данных.
SQL - команды
Основные команды:
create table …()
select … from … where
update … set …where
insert into … values()
(C) В.О. Сафонов. 2013
Пример SQL
Создадим таблицу:
CREATE TABLE "USERS"
( "ID_USER" NUMBER,
"LOGIN" VARCHAR(50),
"PASSWORD" VARCHAR(50),
CONSTRAINT "USERS_PK" PRIMARY KEY
("ID_USER") ENABLE )
/
(C) В.О. Сафонов. 2013
Пример SQL
Заполним созданную таблицу
данными:
INSERT INTO USERS VALUES (
1, “login1“, “pass1“)
/
аналогично:
2, “login2“, “pass2“
3, “login3“, “pass3“
(C) В.О. Сафонов. 2013
Пример SQL
(C) В.О. Сафонов. 2013
Connection
После регистрации драйвера с
помощью диспетчера драйверов его
можно применять для подключения к
базе данных. Для этого диспетчеру
следует сообщить о создании нового
подключения.
Для создания подключения
необходимо указать место
расположения базы данных, а также
(C) В.О. Сафонов. 2013
дополнительную
информацию о ней
URL базы данных
URL базы данных представляет собой
имя, используемое для описания
соединения. Должны быть указаны:
тип драйвера базы данных, тип базы,
тип соединения, а также
дополнительные данные, например
имя пользователя и пароль.
Имеет следующий формат:
jdbc:subprotocol:extra_name
(C) В.О. Сафонов. 2013
URL базы данных
Драйвер типа 1:
jdbc:odbc:<имя_источника_данных>;
параметр=значение;параметр=знач
ение;
Драйвер типа 4:
jdbc:oracle:thin:@<имя_машины>:
(C) В.О. Сафонов. 2013
Connection
Connection conn =
DriverManager.getConnection(
"jdbc:oracle:thin:@localhost:1521:XE",
"test", "123");
Login: test
Password: 123
(C) В.О. Сафонов. 2013
Statement
Для выполнения SQL-команд нужно
создать объект Statement
Statement stat =
conn.createStatement();
Затем создаем строку с SQL-командой
String command = “SELECT * FROM
(C) В.О. Сафонов. 2013
USERS”;
ExecuteQuery(), ExecuteUpdate()
Чтобы выполнить команду, необходимо
вызвать метод executeQuery(). Он
возвращает объект ResultSet, который
можно использовать для просмотра
результатов
ResultSet rs =
stat.executeQuery(command);
executeUpdate() используется для SQLкоманд UPDATE. Метод возвращает
количество строк,
в
(C) В.О.полученных
Сафонов. 2013
результате выполнения команды
ResultSet API
boolean next() – используется для
анализа набора результатов
while (rs.next()){
}
Xxx getXxx(int columnNumber)
Xxx getXxx(String columnName)
int fndColumn(String columnName)
void close()
(C) В.О. Сафонов. 2013
Пример
(C) В.О. Сафонов. 2013
Пример
В качестве результата программа
выведет первый столбец таблицы
1
2
3
Если поменять строку
System.out.println(rs.getString(2));
то результатом будет второй столбец
(login)
(C) В.О. Сафонов. 2013
PreparedStatement
Если несколько раз повторяется
похожий SQL-запрос, то имеет смысл
создать предварительно
подготовленную SQL-команду
String prStr = “SELECT LOGIN FROM
USERS WHERE ID_USER=?”
PreparedStatement pst =
conn.prepareStatement(prStr);
pst.setInt(1,2);
(C) В.О. Сафонов. 2013
Пример 2
(C) В.О. Сафонов. 2013
Пример 2
Результатом работы это программы
будет
login2
Меняя запросы и параметры
вызываемого метода, можно получить
интересующие результаты обо всех
данных, хранящихся в базе данных и
в данной таблице, в частности.
(C) В.О. Сафонов. 2013
Транзакции
Группа команд может быть
оформлена в виде транзакции,
которая может быть либо закончена
после успешного выполнения всех
команд, либо отвергнута, если при
выполнении хотя бы одной возникла
ошибка.
conn.setAutoCommit(false);
(C) В.О. Сафонов. 2013
Транзакции
Statement stat =
conn.createStatement();
stat.executeUpdate(cmd1);
stat.executeUpdate(cmd2);
conn.commit();
или
conn.rollback();
(C) В.О. Сафонов. 2013
Точки сохранения
Повысить возможности контроля за
процессом отката позволяют точки
сохранения
Statement stat =
conn.createStatement();
stat.executeUpdate();
Savepoint svpt = conn.setSavePoint();
…
if (…) conn.rollback(svpt);
conn.commit();(C) В.О. Сафонов. 2013
Пакетное обновление
Если требуется выполнить несколько
команд, например, вставки INSERT, то
для повышения производительности
можно использовать пакеты
обновления(batch update)
Statement stat =
conn.createStatement();
String command = “CREATE TABLE …”;
stat.addBatch(command);
(C) В.О. Сафонов. 2013
Пакетное обновление
while (…) {
command = “INSERT INTO …
VALUES (“ +…+ ”)”;
stat.addBatch(command);
}
int[] counts = stat.executeBatch();
(C) В.О. Сафонов. 2013
Сравнение с .NET
.NET: Реализован LINQ (LanguageIntegrated Query) – более тесная
интеграция приложений с СУБД
(C) В.О. Сафонов. 2013