Работа с БД из Java-программ: JDBC www.spro-club.ru

Содержание

Слайд 2

Необходимые условия

Пакеты java.sql и javax.sql содержат классы и интерфейсы для работы с

Необходимые условия Пакеты java.sql и javax.sql содержат классы и интерфейсы для работы
БД
Для подключения к конкретной СУБД требуется специальная библиотека, называемая драйвером JDBC
Написано большое количество драйверов для большинства СУБД как самими разработчиками, так и сторонними производителями

Слайд 3

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

Первый шаг для работы приложения с БД – это загрузка и

Загрузка драйвера Первый шаг для работы приложения с БД – это загрузка
регистрация необходимого класса драйвера (JAR-библиотеки)
Скачать его можно с официального сайта СУБД или из других источников
Затем библиотеку драйвера нужно «привязать» к проекту – указать путь к нему в параметре CLASSPATH

Слайд 4

Основные компоненты для работы с БД

Интерфейс Connection («соединение»):
в результате успешного подключения

Основные компоненты для работы с БД Интерфейс Connection («соединение»): в результате успешного
к БД создаётся объект, описывающий данное соединение
затем программе возвращается ссылка на этот объект как на «экземпляр» Connection
вся дальнейшая работа с БД ведётся с использованием этой ссылки на подключение

Слайд 5

Основные компоненты для работы с БД

Интерфейс Statement («выражение»):
объекты классов, реализующих этот

Основные компоненты для работы с БД Интерфейс Statement («выражение»): объекты классов, реализующих
интерфейс, используются для подготовки и выполнения SQL-запросов к БД
Интерфейс ResultSet («результирующий набор»):
такие объекты содержат данные, извлечённые из БД в результате выполнения SELECT-запросов с помощью объектов Statement
представляет собой, по сути, коллекцию строк

Слайд 6

Исключения при работе с БД

Главный класс исключений – SQLException (наследник Exception)
Выбрасывается (throws)

Исключения при работе с БД Главный класс исключений – SQLException (наследник Exception)
в результате ошибок, связанных с некорректными SQL-запросами и т.п.

Слайд 7

Алгоритм работы с БД

Регистрация драйвера JDBC.
Создание подключения (Connection).
Создание и подготовка объекта типа

Алгоритм работы с БД Регистрация драйвера JDBC. Создание подключения (Connection). Создание и
Statement (выражение, SQL-запрос)
Выполнение SQL-запроса, подготовленного с помощью Statement
Обработка результатов (например, с помощью ResultSet в случае запроса SELECT)
Закрытие подключения и освобождение использованных ресурсов

Слайд 8

Регистрация драйвера

Может осуществляться разными способами
Например, с помощью класса java.sql. DriverManager
Прямая загрузка класса

Регистрация драйвера Может осуществляться разными способами Например, с помощью класса java.sql. DriverManager
драйвера:
требует явного описания типа, загружаемого драйвера в исходном коде приложения
требуется сначала импортировать соответствующий пакет, а потом загрузить драйвер:
недостаток: при изменении драйвера (смене СУБД) требуется изменение исходного кода программы

import com.mysql.jdbc.Driver;
...
DriverManager.registerDriver(new com.mysql.jdbc.Driver());

Слайд 9

Загрузка драйвера по имени

Более гибкий способ, широко распространён
Может выбрасывать исключение ClassNotFound «Класс

Загрузка драйвера по имени Более гибкий способ, широко распространён Может выбрасывать исключение
не найден»

String driverName = "com.mysql.jdbc.Driver”;
. . .
try { Class.forName( driverName ).newInstance();
} catch (ClassNotFoundException e) {
System.err.println (
“Ошибка: Драйвер " + driverName + " не найден");
System.exit(0);
}

Слайд 10

Установка подключения

класс DriverManager – объект управления JDBC, посредник между программой и драйвером
класс-метод

Установка подключения класс DriverManager – объект управления JDBC, посредник между программой и
DriverManager.getConnection() устанавливает соединение с БД и возвращает ссылку типа Connection
при вызове getConnection() происходит перебор всех загруженных в данный момент драйверов для использования подходящего

Слайд 11

Установка подключения

метод getConnection() может принимать различные параметры (имеет перегруженные версии):
url – адрес

Установка подключения метод getConnection() может принимать различные параметры (имеет перегруженные версии): url
БД (строка подключения), логин и пароль могут быть переданы прямо в URL
передача логина и пароля через отдельные параметры

public static Connection getConnection( String url )
throws SQLException

public static Connection getConnection( String url,
String user,
String password )
throws SQLException

Слайд 12

Настройка подключения

Добавление свойств подключения в объект класса Properties и вызов метода getConnection

Настройка подключения Добавление свойств подключения в объект класса Properties и вызов метода
Properties connInfo = new Properties();
connInfo.put("user", user);
connInfo.put("schema", scheme);
connInfo.put("password", passwd);
con = DriverManager.getConnection(dbUrl, connInfo);

Слайд 13

Типы запросов

Запросы на выборку данных (SQL-оператор Select) – возвращают результирующий набор данных

Типы запросов Запросы на выборку данных (SQL-оператор Select) – возвращают результирующий набор
(объект ResultSet)
Запросы модификации данных (DML) (операторы Insert, Update, Delete) – возвращают целое число – количество обработанных строк

Слайд 14

Выполнение запросов

Требуется получить ссылку на объект типа Statement (выражение) из подключения (объекта

Выполнение запросов Требуется получить ссылку на объект типа Statement (выражение) из подключения
Connection):
SQL-запросы выполняются с помощью перегруженных методов execute класса Statement:
Можно выполнить сразу несколько запросов с помощью int[] executeBatch()

Statement stmt = conn.createStatement();

println(“Результ "+stmt.execute("SELECT * FROM CUSTOMER"));

Слайд 15

Получение результата

Для обработки результатов запроса на выборку надо получить ссылку на объект

Получение результата Для обработки результатов запроса на выборку надо получить ссылку на
типа ResultSet (результирующий набор, курсор):
Результирующий набор – это коллекция (таблица), имеющая несколько строк и столбцов
Для последовательного перехода по строкам используются методы next(), previous(), absolute()
Для извлечения данных используются методы

ResultSet rst = stmt.getResultSet();
или ResultSet rst = stmt.executeQuery(“Select * from tab”);

XXX getXXX(int index); //где ХХХ – тип, напр. getInt(…)

Слайд 16

Навигация по курсору

boolean next() – переход к следующей строке набора. Если записей

Навигация по курсору boolean next() – переход к следующей строке набора. Если
больше нет, возвращает false
boolean previous() – переход к предыдущей строке набора
boolean absolute(int row) – абсолютное позиционирование курсора на заданную строку
boolean relative(int rows) – относительное позиционирование курсора. rows – число строк, на которое нужно перейти вперёд или назад (может быть положительным или отрицательным)

Слайд 17

Навигация по курсору

int findColumn(String columnLabel) – возвращает номер столбца с указанным именем

Навигация по курсору int findColumn(String columnLabel) – возвращает номер столбца с указанным именем

Слайд 18

Извлечение и запись данных

существует множество методов вида:
Данные извлекаются из текущей строки
Для записи

Извлечение и запись данных существует множество методов вида: Данные извлекаются из текущей
значений в набор используется множество методов вида:
После установки значения следует вызвать метод

XXX getXXX(int index); // index – номер столбца начиная с 1
ХХХ getXXX(String label) // label – имя столбца
XXX – тип данных, например getString(int col);

void updateXXX(int colIndex, XXX val)
например, updateByte(int columnIndex, byte x)

void updateRow(); // обновление текущей строки в БД

Слайд 19

Пример обновления и вставки

Обновление значения в столбце:
Вставка новой строки с 3-мя столбцами:

rs.absolute(5);

Пример обновления и вставки Обновление значения в столбце: Вставка новой строки с
// moves the cursor to the fifth row of rs
rs.updateString("NAME", "AINSWORTH"); // updates the
// NAME column of row 5 to be AINSWORTH
rs.updateRow(); // updates the row in the data source

rs.moveToInsertRow(); // moves cursor to the insert row
rs.updateString(1, "AINSWORTH"); // updates the
// first column of the insert row to be AINSWORTH
rs.updateInt(2,35); // updates the second column to be 35
rs.updateBoolean(3, true); // записывает в 3-й столбец true
rs.insertRow();
rs.moveToCurrentRow();

Слайд 20

Пример навигации и чтения

// цикл по всем строкам результирующего набора
while (rst.next()) {

Пример навигации и чтения // цикл по всем строкам результирующего набора while
System.out.printf("номер строки %3d:", rst.getRow());
// получение значения столбцов по номеру и имени столбца
int id = rst.getInt(1);
String nm = rst.getString("NAME");
String city = rst.getString("CITY");
System.out.printf("%10d | %30s | %10s\n",id,nm,city);
}

Слайд 21

Получение метаданных

Метаданные – информация о структуре результирующего набора – именах столбцов, типов

Получение метаданных Метаданные – информация о структуре результирующего набора – именах столбцов,
их данных и т.п.
Для получения метаданных используется метод getMetaData() результирующего набора (ResultSet), кот. возвращает ссылку на объект типа ResultSetMetaData
Эти данные могут быть полезны для настройки интерфейса пользователя (заголовки таблиц, ширина столбцов и т.п.)

ResultSetMetaData meta=(ResultSetMetaData) rst.getMetaData();

Слайд 22

Методы класса ResultSetMetaData

int getColumnCount() – число столбцов в наборе
String getColumnName(int column) –

Методы класса ResultSetMetaData int getColumnCount() – число столбцов в наборе String getColumnName(int
имя указанного столбца (нумерация с 1)
String getColumnTypeName(int column) – наименование типа указанного столбца
int getColumnType(int column) – возвращает тип столбца (целое) - одну из констант класса java.sql.Types
String getTableName(int column) – имя таблицы, которой принадлежит указанный столбец набора (актуально при запросах к нескольким таблицам)

Слайд 23

Методы класса ResultSetMetaData

boolean isAutoIncrement(int column) – является ли указанный столбец автоинкрементным (счётчиком, увеличивающимся автоматически)
int isNullable(int column)

Методы класса ResultSetMetaData boolean isAutoIncrement(int column) – является ли указанный столбец автоинкрементным
– может ли столбец содержать пустые значения (NULL)
int getColumnDisplaySize(int column) – максимальная ширина столбца в символах
Все методы могут выбрасывать исключение SQLException

Слайд 24

Пример

// информация о столбцах ResultSet-а
System.out.println("\n\nResultSet metadata info:");
ResultSetMetaData meta = (ResultSetMetaData) rst.getMetaData();
int n

Пример // информация о столбцах ResultSet-а System.out.println("\n\nResultSet metadata info:"); ResultSetMetaData meta =
= meta.getColumnCount();
for (int i=1;i<=n;i++) {
System.out.printf("%d = %s <%s>",
i,
meta.getColumnName(i),
meta.getColumnTypeName(i));
if (meta.isNullable(i)==meta.columnNoNulls) System.out.print(" NOT NULL");
if (meta.isAutoIncrement(i)) System.out.print(" AUTO");
System.out.println("");
}

Слайд 25

Подготовленные выражения

Служат для повышения эффективности многократного выполнения однотипных запросов (с разными параметрами)
Для

Подготовленные выражения Служат для повышения эффективности многократного выполнения однотипных запросов (с разными
работы с ними используется объект класса PreparedStatement

Слайд 26

Пример

PreparedStatement pst=null;
pst = conn.prepareStatement("select * from Customer where City like ?");
if (pst

Пример PreparedStatement pst=null; pst = conn.prepareStatement("select * from Customer where City like
!= null) {
// 1-е использование
pst.setString(1, "%New%");
rst = pst.executeQuery();
while (rst.next()) {
System.out.printf("%10d| %30s| %10s\n", rst.getInt(1),
rst.getString("NAME"), rst.getString("CITY"));
}
// 2-е использование
pst.setString(1, "%San%");
rst = pst.executeQuery();
while (rst.next()) {
System.out.printf("%10d| %30s| %10s\n",rst.getInt(1),
rst.getString("NAME"), rst.getString("CITY"));
}
}

Слайд 27

Транзакции

Транзакция – это механизм выполнения составных запросов (операций), позволяющий сохранить изменения только

Транзакции Транзакция – это механизм выполнения составных запросов (операций), позволяющий сохранить изменения
в случае успешного выполнения всех операций, входящих в набор
Пример: перевод денег с одного счёта на другой состоит из 2х операций (запросов Update) – списание со счёта отправителя и зачисление на счёт получателя
Работают по принципу «всё или ничего»
Являются неотъемлемой частью профессиональной работы с БД, особенно в крупных и ответственных проектах

Слайд 28

Автоматическая фиксация изменений

По умолчанию в JDBC принята автоматическая фиксация каждого изменения
Можно изменить

Автоматическая фиксация изменений По умолчанию в JDBC принята автоматическая фиксация каждого изменения
это поведение с помощью метода:
conn.setAutoCommit( false );
В этом случае для сохранения изменений требуется явным образом вызывать метод commit(), а для их отмены – метод rollback() интерфейса Connection
Такое поведение позволяет управлять транзакциями

Слайд 29

Пакетное выполнение

Класс PreparedStatement содержит методы для пакетного выполнения DML-запросов (на изменение данных)
Это

Пакетное выполнение Класс PreparedStatement содержит методы для пакетного выполнения DML-запросов (на изменение
актуально при отключении авто-обновления
Для этого после подготовки выражения (prepareStatement) вместо выполнения вызывается метод addBatch()
Для выполнения пакета запросов вызывается метод executeBatch(), кот.возвращает массив целых чисел – кол-во обработанных строк по каждому запросу
Имя файла: Работа-с-БД-из-Java-программ:-JDBC-www.spro-club.ru.pptx
Количество просмотров: 1263
Количество скачиваний: 2