- •Работа с базами данных JDBC
- •JDBC
- •Типы драйверов JDBC
- •Соединение с БД
- •URL соединения
- •Выполнение выражений
- •Выполнение запросов
- •Добавление данных в таблицу
- •Обработка ошибок (SQLException)
- •Предупреждения (SQLWarning)
- •Категоризация исключений
- •ResultSet
- •Получение значений из ResultSet
- •Авто-коммит
- •Пакетные (batch) операции
- •Подготовленные выражения
- •Пакетные поготовленные выражения
- •Statement и PreparedStatement
- •Транзакции
- •Точки сохранения (Savepoint)
- •Освобождение точки сохранений
- •Ситуации с параллельным использованием БД
- •Уровни изоляций транзакций
- •Использование большого количества данных
Работа с базами данных JDBC
JDBC
Java приложение
Клиентское приложение
JDBC драйвер
Проприетарный протокол взаимодействия
Сервер СУБД
СУБД
Цель JDBC — унифицировать работу с СУБД для Java приложений
Типы драйверов JDBC
Тип 1. Реализация доступа к другому какому либо DB API (например, ODBC). Драйвер как правило реализован в виде «нативного» кода. Например: JDBC- ODBC bridge.
Тип 2. Драйвер реализован частично на Java. Пример: Oracle OCI драйвер
Тип 3. Драйвер на «чистой» («pure») Java, реализующий интерфейс к промежуточному серверу по общему протоколу.
Тип 4. Драйвер на «чистой» Java, реализующий конкретный протокол СУБД.
Соединение с БД
До JDBC 4.0 (JDK 6) необходимо регистрировать драйверы:
Два способа: ConnectionManager.registerDriver( new com.mysql.jdbc.Driver())
Класс DriverManager
Класс Datasource
Properties props = new Properties();
props.setProperty(«user», «vasya»);
props.setProperty(«password», «123»);
Connection conn =
DriverManager.getConnection(«jdbc:mysql://localhost:3 306/mydb», props);
Connection conn =
DriverManager.getConnection(«jdbc:derby:db/mydb;creat e=true», props);
URL соединения
URL соединения указывает драйверу куда и как подключаться.
Синтаксис зависит от драйвера.
Java DB (Derby):
dbc:derby:[subsubprotocol:][databaseName]
[;attribute=value]*
Mysql:
jdbc:mysql://[host][,failoverhost...][:port]/ [database][?propertyName1][=propertyValue1] [&propertyName2][=propertyValue2]...
Выполнение выражений
Для выполнения выражений используется интерфейс Statement.
Statement stmt = conn.createStatement(); try {
stmt.executeUpdate(«create table employees »+
«(id integer NOT NULL generated always as identity, »+ «first_name varchar(64) NOT NULL, » +
«last_name varchar(64) NOT NULL, » + «salary float NOT NULL, »+
«PRIMARY KEY (id))»; } finally {
stmt.close();
}
Выполнение запросов
ResultSet — интерфейс для объектов с результатами запроса.
…
ResultSet rs = stmt.executeQuery(«select * from employees»);
try {
while (rs.next()) { System.out.printf(«%s | %s | %
rs.getString(1), rs.getString(2),
}
} finally { rs.close();
}
Никогда так не делайте! Необходимо указывать список столбцов!
Добавление данных в таблицу
...
stmt.execute(«insert into employees»+
«(first_name, last_name, salary) » +
«values ('Вася', 'Пупкин', 30000)»,
Statement.RETURN_GENERATED_KEYS); ResultSet rs = stmt.getGeneratedKeys();
rs.next();
System.out.println(«Добавлена запись с ID: » + rs.getInt(1));
...
Обработка ошибок (SQLException)
SQLState: 42Y55
Error Code: 30000
Исключение Message: 'DROP TABLE' cannot be performed on 'MYDB.EMPLOYEES' because it does not exist.
getMessage()
ошибке
getSQLState()
обозначение ошибки по ISO/ANSI
getErrorCode() - возвращает код ошибки
getNextException() - возвращает следующее исключение в цепочке исключений
Предупреждения (SQLWarning)
SQLWarning — наследник SQLException.SQLWarning stmt.getWarnings()
Предупреждения очищаются перед каждым новым вызовом выражения.