Download - Java осень 2014 занятие 7
![Page 1: Java осень 2014 занятие 7](https://reader034.vdocuments.mx/reader034/viewer/2022052123/558b893ad8b42a061b8b47c2/html5/thumbnails/1.jpg)
Углубленное программирование на
Java Лекция 3.1
«Базы данных»
Виталий Чибриков
![Page 2: Java осень 2014 занятие 7](https://reader034.vdocuments.mx/reader034/viewer/2022052123/558b893ad8b42a061b8b47c2/html5/thumbnails/2.jpg)
План лекции
2
1. JDBC
2. Executor
3. Транзакции
![Page 3: Java осень 2014 занятие 7](https://reader034.vdocuments.mx/reader034/viewer/2022052123/558b893ad8b42a061b8b47c2/html5/thumbnails/3.jpg)
Термины и сокращения
3
JDBC Java Database Connectivity
ORM Object Relational Mapping
JPA Java Persistency API
Hibernate популярная библиотека для ORM, implements JPA
DAO Data Access Object
![Page 4: Java осень 2014 занятие 7](https://reader034.vdocuments.mx/reader034/viewer/2022052123/558b893ad8b42a061b8b47c2/html5/thumbnails/4.jpg)
Инструменты
4
MySQL Community Server
MySQL Workbench
MySQL Connector: Connector/J
http://dev.mysql.com/downloads/
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.6</version> </dependency>
![Page 5: Java осень 2014 занятие 7](https://reader034.vdocuments.mx/reader034/viewer/2022052123/558b893ad8b42a061b8b47c2/html5/thumbnails/5.jpg)
JDBC
5
Java Database Connectivity ― API для работы с базами из приложений на Java
Предназначена для работы с реляционными базами данных
Предоставляет методы для получения и обновления данных
Не зависит от конкретного типа базы
![Page 6: Java осень 2014 занятие 7](https://reader034.vdocuments.mx/reader034/viewer/2022052123/558b893ad8b42a061b8b47c2/html5/thumbnails/6.jpg)
ResultSet
Connection
JDBC API
6
Объект отвечает за соединение с базой и режим работы с ней
Объект с результатом запроса, который вернула база
Statement
Объект представляет выражение обращения к базе
![Page 7: Java осень 2014 занятие 7](https://reader034.vdocuments.mx/reader034/viewer/2022052123/558b893ad8b42a061b8b47c2/html5/thumbnails/7.jpg)
JDBC Driver Manager
7
Название класса драйвера: com.mysql.jdbc.Driver
(Driver) Class.forName("com.mysql.jdbc.Driver").newInstance()
Создаем объект драйвера при помощи reflection:
java.sql.DriverManager – класс хелпер для работы с драйверами
Регистрируем драйвер:
DriverManager.registerDriver(driver);
![Page 8: Java осень 2014 занятие 7](https://reader034.vdocuments.mx/reader034/viewer/2022052123/558b893ad8b42a061b8b47c2/html5/thumbnails/8.jpg)
Connection
8
Driver driver = (Driver) Class.forName("com.mysql.jdbc.Driver").newInstance(); DriverManager.registerDriver(driver);
StringBuilder url = new StringBuilder();
url. append("jdbc:mysql://"). //db type append("localhost:"). //host name append("3306/"). //port append("db_example?"). //db name append("user=tully&"). //login append("password=tully"); //password
// URL: “jdbc:mysql://localhost:3306/lecture_db?user=tully&password=tully”
Connection connection = DriverManager.getConnection(url.toString());
![Page 9: Java осень 2014 занятие 7](https://reader034.vdocuments.mx/reader034/viewer/2022052123/558b893ad8b42a061b8b47c2/html5/thumbnails/9.jpg)
Statements
9
JDBC позволяет создавать и выполнять запросы к базе
Update statements: CREATE, DELETE, INSERT…
Query statements: SELECT
Интерфейсы
Statement
PreparedStatement
CallableStatement
Query statements возвращают ResultSet
Update statements возвращают число измененных строк
![Page 10: Java осень 2014 занятие 7](https://reader034.vdocuments.mx/reader034/viewer/2022052123/558b893ad8b42a061b8b47c2/html5/thumbnails/10.jpg)
ResultSet
10
Содержит результат запроса
Доступ к полям текущей строки:
По имени колонки: getBoolean(String name), getLong(String name)…
По индексу колонки: getBoolean(int index), getLong(int index)…
Перемещение по строкам:
next()
previous()
isLast()
![Page 11: Java осень 2014 занятие 7](https://reader034.vdocuments.mx/reader034/viewer/2022052123/558b893ad8b42a061b8b47c2/html5/thumbnails/11.jpg)
stmt = con.createStatement(); ResultSet resultSet = stmt.executeQuery(query); while (resultSet.next()) { boolean deleted = resultSet.getBoolean(1); … }
ResultSet
11
![Page 12: Java осень 2014 занятие 7](https://reader034.vdocuments.mx/reader034/viewer/2022052123/558b893ad8b42a061b8b47c2/html5/thumbnails/12.jpg)
Все обращения надо закрывать вручную
close()
12
resultSet.close()
statement.close()
connection.close()
![Page 13: Java осень 2014 занятие 7](https://reader034.vdocuments.mx/reader034/viewer/2022052123/558b893ad8b42a061b8b47c2/html5/thumbnails/13.jpg)
План лекции
13
1. JDBC
2. Executor
3. Транзакции
![Page 14: Java осень 2014 занятие 7](https://reader034.vdocuments.mx/reader034/viewer/2022052123/558b893ad8b42a061b8b47c2/html5/thumbnails/14.jpg)
Executor
14
Объект, который содержит методы для работы с запросами
execUpdate(Connection connection, String update)
execQuery(Connection connection, String query, ResultHandler handler)
Обработка запроса на создание, вставку, обновление и удаление
Обработка запроса на получение данных
public interface ResultHandler { void handle(ResultSet result) throws SQLException; }
![Page 15: Java осень 2014 занятие 7](https://reader034.vdocuments.mx/reader034/viewer/2022052123/558b893ad8b42a061b8b47c2/html5/thumbnails/15.jpg)
Update Statement
15
public static int execUpdate(Connection connection, String update) { Statement stmt = connection.createStatement(); stmt.execute(update); int updated = stmt.getUpdateCount(); stmt.close(); return updated; }
Примеры
execUpdate(connection, "create table users (id bigint auto_increment, name varchar(256), primary key (id))");
execUpdate(connection, "insert into users (name) values ('tully')");
![Page 16: Java осень 2014 занятие 7](https://reader034.vdocuments.mx/reader034/viewer/2022052123/558b893ad8b42a061b8b47c2/html5/thumbnails/16.jpg)
Select Statement
16
public interface ResultHandler { void handle(ResultSet result) throws SQLException; }
private static void execQuery(Connection connection, String query, ResultHandler handler){ Statement stmt = connection.createStatement(); stmt.execute(query); ResultSet result = stmt.getResultSet(); handler.handle(result); result.close(); stmt.close(); }
![Page 17: Java осень 2014 занятие 7](https://reader034.vdocuments.mx/reader034/viewer/2022052123/558b893ad8b42a061b8b47c2/html5/thumbnails/17.jpg)
Вызов execQuery
17
String query = “select * from users where name = ‘tully’”; ResultHandler handler = new ResultHandlerImpl() execQuery(connection, query, handler);
class ResultHandlerImpl implements ResultHandler{ public void handle(ResultSet result) throws SQLException { result.next(); System.out.append("User: " + result.getString("name") + '\n'); } }
…
![Page 18: Java осень 2014 занятие 7](https://reader034.vdocuments.mx/reader034/viewer/2022052123/558b893ad8b42a061b8b47c2/html5/thumbnails/18.jpg)
Типизация
18
public interface TResultHandler<T> { T handle(ResultSet resultSet) throws SQLException; }
public class TExecutor { public <T> T execQuery(Connection connection, String query, TResultHandler<T> handler) throws SQLException { Statement stmt = connection.createStatement(); stmt.execute(query); ResultSet result = stmt.getResultSet(); T value = handler.handle(result); result.close(); stmt.close(); return value; } }
![Page 19: Java осень 2014 занятие 7](https://reader034.vdocuments.mx/reader034/viewer/2022052123/558b893ad8b42a061b8b47c2/html5/thumbnails/19.jpg)
Типизация
19
TExecutor execT = new TExecutor(); String query = “select user_name from users where id=1”; String name = execT.execQuery( connection, query, new TResultHandler<String>(){
public String handle(ResultSet result) throws SQLException { result.next(); return result.getString("user_name"); }
});
System.out.append("User: " + name + '\n');
![Page 20: Java осень 2014 занятие 7](https://reader034.vdocuments.mx/reader034/viewer/2022052123/558b893ad8b42a061b8b47c2/html5/thumbnails/20.jpg)
План лекции
20
1. JDBC
2. Executor
3. Транзакции
![Page 21: Java осень 2014 занятие 7](https://reader034.vdocuments.mx/reader034/viewer/2022052123/558b893ad8b42a061b8b47c2/html5/thumbnails/21.jpg)
Transactions
21
По-умолчанию auto-commit после выполнения каждого statement-а
void setAutoCommit(boolean autoCommit) – вкл/выкл автокоммита
void commit()
void rollback()
![Page 22: Java осень 2014 занятие 7](https://reader034.vdocuments.mx/reader034/viewer/2022052123/558b893ad8b42a061b8b47c2/html5/thumbnails/22.jpg)
Transactions
22
public void execUpdate(Connection connection, String[] updates) { try { connection.setAutoCommit(false); for(String update: updates){ Statement stmt = connection.createStatement(); stmt.execute(update); stmt.close(); } connection.commit(); } catch (SQLException e) { try { connection.rollback(); connection.setAutoCommit(true); } catch (SQLException ignore) {} } }
![Page 23: Java осень 2014 занятие 7](https://reader034.vdocuments.mx/reader034/viewer/2022052123/558b893ad8b42a061b8b47c2/html5/thumbnails/23.jpg)
Prepared Statements
23
public void execUpdate(Connection connection, Map<Integer, String> idToName) { try{ String update = "insert into users(id, user_name) values(?, ?)"; PreparedStatement stmt = connection.prepareStatement(update);
for(Integer id: idToName.keySet()){ stmt.setInt(1, id); stmt.setString(2, idToName.get(id)); stmt.executeUpdate(); } stmt.close(); } catch (SQLException e) { e.printStackTrace(); } }
![Page 24: Java осень 2014 занятие 7](https://reader034.vdocuments.mx/reader034/viewer/2022052123/558b893ad8b42a061b8b47c2/html5/thumbnails/24.jpg)
Демонстрация кода
24
в