Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare a Scribd company logo
Углубленное 
программирование на 
Java 
Лекция 3.1 
«Базы данных» 
Виталий Чибриков
План лекции 
2 
1. JDBC 
2. Executor 
3. Транзакции
Термины и сокращения 
3 
JDBC Java Database Connectivity 
ORM Object Relational Mapping 
JPA Java Persistency API 
Hibernate популярная библиотека для ORM, implements JPA 
DAO Data Access Object
Инструменты 
4 
http://dev.mysql.com/downloads/ 
MySQL Community Server 
MySQL Workbench 
MySQL Connector: Connector/J 
<dependency> 
<groupId>mysql</groupId> 
<artifactId>mysql-connector-java</artifactId> 
<version>5.1.6</version> 
</dependency>
JDBC 
5 
Java Database Connectivity ― API для работы с базами из приложений 
на Java 
Предназначена для работы с реляционными базами данных 
Предоставляет методы для получения и обновления данных 
Не зависит от конкретного типа базы
JDBC API 
Connection 
Statement 
Объект представляет выражение обращения к базе 
ResultSet 
6 
Объект отвечает за соединение с базой и режим работы с ней 
Объект с результатом запроса, который вернула база
JDBC Driver Manager 
7 
Название класса драйвера: com.mysql.jdbc.Driver 
Создаем объект драйвера при помощи reflection: 
(Driver) Class.forName("com.mysql.jdbc.Driver").newInstance() 
java.sql.DriverManager – класс хелпер для работы с драйверами 
Регистрируем драйвер: 
DriverManager.registerDriver(driver);
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());
Statements 
9 
JDBC позволяет создавать и выполнять запросы к базе 
Update statements: CREATE, DELETE, INSERT… 
Query statements: SELECT 
Интерфейсы 
Statement 
PreparedStatement 
CallableStatement 
Query statements возвращают ResultSet 
Update statements возвращают число измененных строк
ResultSet 
10 
Содержит результат запроса 
Перемещение по строкам: 
next() 
previous() 
isLast() 
Доступ к полям текущей строки: 
По имени колонки: getBoolean(String name), getLong(String name)… 
По индексу колонки: getBoolean(int index), getLong(int index)…
ResultSet 
stmt = con.createStatement(); 
ResultSet resultSet = stmt.executeQuery(query); 
while (resultSet.next()) { 
boolean deleted = resultSet.getBoolean(1); 
… 
} 
11
close() 
Все обращения надо закрывать вручную 
12 
resultSet.close() 
statement.close() 
connection.close()
План лекции 
13 
1. JDBC 
2. Executor 
3. Транзакции
Executor 
14 
Объект, который содержит методы для работы с запросами 
Обработка запроса на создание, вставку, обновление и удаление 
execUpdate(Connection connection, String update) 
Обработка запроса на получение данных 
execQuery(Connection connection, String query, ResultHandler handler) 
public interface ResultHandler { 
void handle(ResultSet result) throws SQLException; 
}
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')");
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(); 
}
Вызов execQuery 
17 
class ResultHandlerImpl implements ResultHandler{ 
public void handle(ResultSet result) throws SQLException { 
result.next(); 
System.out.append("User: " + result.getString("name") + 
'n'); 
} 
} 
… 
String query = “select * from users where name = ‘tully’”; 
ResultHandler handler = new ResultHandlerImpl() 
execQuery(connection, query, handler);
Типизация 
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; 
} 
}
Типизация 
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');
План лекции 
20 
1. JDBC 
2. Executor 
3. Транзакции
Transactions 
21 
По-умолчанию auto-commit после выполнения каждого statement-а 
void setAutoCommit(boolean autoCommit) – вкл/выкл автокоммита 
void commit() 
void rollback()
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) {} 
} 
}
Prepared Statements 
public void execUpdate(Connection connection, Map<Integer, String> idToName) { 
23 
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(); 
} 
}
Демонстрация кода 
24 
в
Спасибо за внимание 
Виталий Чибриков 
chibrikov@corp.mail.ru

More Related Content

Java осень 2014 занятие 7

  • 1. Углубленное программирование на Java Лекция 3.1 «Базы данных» Виталий Чибриков
  • 2. План лекции 2 1. JDBC 2. Executor 3. Транзакции
  • 3. Термины и сокращения 3 JDBC Java Database Connectivity ORM Object Relational Mapping JPA Java Persistency API Hibernate популярная библиотека для ORM, implements JPA DAO Data Access Object
  • 4. Инструменты 4 http://dev.mysql.com/downloads/ MySQL Community Server MySQL Workbench MySQL Connector: Connector/J <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.6</version> </dependency>
  • 5. JDBC 5 Java Database Connectivity ― API для работы с базами из приложений на Java Предназначена для работы с реляционными базами данных Предоставляет методы для получения и обновления данных Не зависит от конкретного типа базы
  • 6. JDBC API Connection Statement Объект представляет выражение обращения к базе ResultSet 6 Объект отвечает за соединение с базой и режим работы с ней Объект с результатом запроса, который вернула база
  • 7. JDBC Driver Manager 7 Название класса драйвера: com.mysql.jdbc.Driver Создаем объект драйвера при помощи reflection: (Driver) Class.forName("com.mysql.jdbc.Driver").newInstance() java.sql.DriverManager – класс хелпер для работы с драйверами Регистрируем драйвер: DriverManager.registerDriver(driver);
  • 8. 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());
  • 9. Statements 9 JDBC позволяет создавать и выполнять запросы к базе Update statements: CREATE, DELETE, INSERT… Query statements: SELECT Интерфейсы Statement PreparedStatement CallableStatement Query statements возвращают ResultSet Update statements возвращают число измененных строк
  • 10. ResultSet 10 Содержит результат запроса Перемещение по строкам: next() previous() isLast() Доступ к полям текущей строки: По имени колонки: getBoolean(String name), getLong(String name)… По индексу колонки: getBoolean(int index), getLong(int index)…
  • 11. ResultSet stmt = con.createStatement(); ResultSet resultSet = stmt.executeQuery(query); while (resultSet.next()) { boolean deleted = resultSet.getBoolean(1); … } 11
  • 12. close() Все обращения надо закрывать вручную 12 resultSet.close() statement.close() connection.close()
  • 13. План лекции 13 1. JDBC 2. Executor 3. Транзакции
  • 14. Executor 14 Объект, который содержит методы для работы с запросами Обработка запроса на создание, вставку, обновление и удаление execUpdate(Connection connection, String update) Обработка запроса на получение данных execQuery(Connection connection, String query, ResultHandler handler) public interface ResultHandler { void handle(ResultSet result) throws SQLException; }
  • 15. 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')");
  • 16. 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(); }
  • 17. Вызов execQuery 17 class ResultHandlerImpl implements ResultHandler{ public void handle(ResultSet result) throws SQLException { result.next(); System.out.append("User: " + result.getString("name") + 'n'); } } … String query = “select * from users where name = ‘tully’”; ResultHandler handler = new ResultHandlerImpl() execQuery(connection, query, handler);
  • 18. Типизация 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; } }
  • 19. Типизация 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');
  • 20. План лекции 20 1. JDBC 2. Executor 3. Транзакции
  • 21. Transactions 21 По-умолчанию auto-commit после выполнения каждого statement-а void setAutoCommit(boolean autoCommit) – вкл/выкл автокоммита void commit() void rollback()
  • 22. 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) {} } }
  • 23. Prepared Statements public void execUpdate(Connection connection, Map<Integer, String> idToName) { 23 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(); } }
  • 25. Спасибо за внимание Виталий Чибриков chibrikov@corp.mail.ru