- •Работа с базами данных JDBC
- •JDBC
- •Типы драйверов JDBC
- •Соединение с БД
- •URL соединения
- •Выполнение выражений
- •Выполнение запросов
- •Добавление данных в таблицу
- •Обработка ошибок (SQLException)
- •Предупреждения (SQLWarning)
- •Категоризация исключений
- •ResultSet
- •Получение значений из ResultSet
- •Авто-коммит
- •Пакетные (batch) операции
- •Подготовленные выражения
- •Пакетные поготовленные выражения
- •Statement и PreparedStatement
- •Транзакции
- •Точки сохранения (Savepoint)
- •Освобождение точки сохранений
- •Ситуации с параллельным использованием БД
- •Уровни изоляций транзакций
- •Использование большого количества данных
Категоризация исключений
SQLException имеет ряд дочерних классов:
SQLNonTransientException — повторная попытка выполнить операцию вызовет такую же ошибку
SQLTransientException — повторная попытка может закончится успешно
SQLRecoverableException — приложению необходимо выполнить действия по восстановлению соединению и попробовать повторить операцию
ResultSet
Типы ResultSet:
TYPE_FORWARD_ONLY
TYPE_SCROLL_INSENSITIVE
TYPE_SCROLL_SENSITIV
Уровень доступа к данным (concurrency level):
CONCUR_READ_ONLY
CONCUR_UPDATABLE
Получение значений из ResultSet
ResultSet имеет методы:
getInt, getLong, getFloat, getDouble, getBoolean, getString и т.д.
Методы могут возвращать значение поля как по номеру (нумерация от единицы) столбца, так и по его названию:
String firstName = rs.getString(1); double salary = rs.getDouble('salary');
Авто-коммит
По умолчанию, каждая операция вызывает изменение данных в БД.
conn.setAutoCommit(false) — отключает это.
conn.commit() - «применяет» ранее вызванные операции над БД.
Пакетные (batch) операции
Пакетные операции ускоряют работу с БД.
conn.setAutoCommit(false); stmt.addBatch(«insert into employees »+
«(first_name, last_name_salary) »+ «values ('Вася', 'Пупкин', 30000)»); stmt.addBatch(«insert into employees »+ «(first_name, last_name_salary) »+
«values ('Петя', 'Сидоров', 20000)»); int[] updateCounts = stmt.executeBatch(); conn.commit();
Подготовленные выражения
PreparedStatement — подготовленное выражение, позволяет выполнять один и тот же запрос с разными параметрами.
PreparedStatement pstmt = conn.prepareStatement(«insert into employees »+
«(first_name, last_name, salary) »+ «values (?,?,?)»);
for (Employee e : employees) { pstmt.setString(1, e.getFirstName()); pstmt.setString(2, e.getLastName()); pstmt.setDouble(3, e.getSalary()); pstmt.executeUpdate();
}
Пакетные поготовленные выражения
conn.setAutoCommit(false);
PreparedStatement pstmt = conn.prepareStatement(«insert into employees »+
«(first_name, last_name, salary) »+
«values (?,?,?)»);
for (Employee e : employees) { pstmt.setString(1, e.getFirstName();
pstmt.setString(2, e.getLastName());
pstmt.setDouble(3, e.getSalary());
pstmt.addBatch();
}
int[] updateCounts = pstmt.executeBatch();
conn.commit();
Statement и PreparedStatement
Преимущества PreparedStatement
Компилируются на стороне СУБД
Быстрее выполняются
Пригодно для многократного использования с разными подставляемыми значениями в параметры
Транзакции
Транзакция — это набор одного или нескольких SQL выражений, выполняемых атомарно и, которые либо выполняются все, либо не выполняется ни одно.
Необходимо запретить авто-коммит: conn.setAutoCommit(false); Применение тразнакции: conn.commit();
Откат транзакции: conn.rollback();
Точки сохранения (Savepoint)
Точка сохранения — это какой либо шаг в транзакции.
Точки сохранения позволяет откатить выражения в транзакции.
conn.setAutoCommit(false); stmt.executeUpdate(...)
Savepoint save1 = con.setSavepoint(); ResultSet rs = stmt.executeQuery(...); If (!rs.next())
conn.rollback(save1);
conn.commit();