Углубленное
программирование
на Java
Лекция 8
«Базы данных»
Виталий Чибриков
План лекции
1. JDBC
2. Statements
3. Transactions
4. DataSet & DAO

5. DB Service

2
Термины и сокращения
JDBC

Java Database Connectivity

ORM

Object Relational Mapping

JPA

Java Persistency API

Hibernat...
Инструменты
http://dev.mysql.com/downloads/
MySQL Community Server

MySQL Workbench
MySQL Connector: Connector/J

4
JDBC
Java Database Connectivity ― API для работы с базами из приложений
на Java
Предназначена для работы с реляционными ба...
JDBC Driver Manager
Название класса драйвера: com.mysql.jdbc.Driver
Создаем объект драйвера при помощи reflection:
(Driver...
JDBC API

Connection
Объект отвечает за соединение с базой и режим работы с ней

Statement
Объект представляет выражение о...
Connection
Создание Statement объекта
Statement createStatement() – обычный запрос
PreparedStatement prepareStatement() – ...
Connection
Транзакционность
По-умолчанию auto-commit после выполнения каждого statement-а
void setAutoCommit(boolean autoC...
Connection
Driver driver = (Driver) Class.forName("com.mysql.jdbc.Driver").newInstance();
DriverManager.registerDriver(dri...
Connection pool
Обращение к базе происходит синхронно
Поток посылает запрос к базе и ждет ответа
Если в приложении много п...
План лекции
1. JDBC
2. Statements
3. Transactions
4. DataSet & DAO

5. DB Service

12
Statements
JDBC позволяет создавать и выполнять запросы к базе
Update statements: CREATE, DELETE, INSERT…
Query statements...
ResultSet
Содержит результат запроса
Перемещение по строкам:
next()
previous()
isLast()

Доступ к полям текущей строки:
По...
Executor
Объект, который содержит методы для работы с запросами
Обработка запроса на создание, вставку, обновление и удале...
Update Statement
public static int execUpdate(Connection connection, String update) {
Statement stmt = connection.createSt...
Select Statement
public interface ResultHandler {
void handle(ResultSet result) throws SQLException;
}
private static void...
Вызов execQuery
String query = “select * from users where name = ‘tully’”;
execQuery(connection, query, new ResultHandler(...
close()
Все обращения надо закрывать вручную
resultSet.close()

statement.close()
connection.close()

19
План лекции
1. JDBC
2. Statements
3. Transactions
4. DataSet & DAO

5. DB Service

20
Transactions
public void execUpdate(Connection connection, String[] updates) {
try {
connection.setAutoCommit(false);
for(...
Prepared Statements
public void execUpdate(Connection connection, Map<Integer, String> idToName) {
try{
String update = "i...
Типизация
public interface TResultHandler<T> {
T handle(ResultSet resultSet) throws SQLException;
}
public class TExecutor...
Типизация
TExecutor execT = new TExecutor();
String query = “select user_name from users where id=1”;
String name = execT....
План лекции
1. JDBC
2. Statements
3. Transactions
4. DataSet & DAO

5. DB Service

25
DataSet
DataSet ― объект содержащий данные одной строки таблицы
На каждую таблицу свой DataSet

Извлечние и встаку данных ...
DataSet
public class UsersDataSet {
private long id;
private String name;
public UsersDataSet(long id, String name){
this....
DAO
Data Access Object
Объект доступа к данным

Шаблон проектирования скрывающий детали работы с базой
Обычно один DAO на ...
interface UsersDAO
public interface UsersDAO {
UsersDataSet get(long id) throws SQLException;
UsersDataSet getByName(Strin...
План лекции
1. JDBC
2. Statements
3. Transactions
4. DataSet & DAO

5. DB Service

30
Database Service
DatabaseService ― служба в отдельном потоке

TExecutor ― класс с типизированными методами для работы
с за...
Database Service
DatabaseService ― служба в отдельном потоке. Abonent
Каждый DatabaseService при старте открывает Connecti...
Executor
Executor ― класс с типизированными методами для работы
с запросами
*Поддерживает транзакционность
**Поддерживает ...
DAO и DataSet
UsersDAO ― объект доступа к данным таблицы USERS
UsersDataSet ― объект с данными одной строки таблицы USERS
...
Билеты
38. JDBC API.
39. class Connection из JDBC API. Задачи которые решает Connection.
40. Dependency Injection. Использ...
На следующей лекции
1. Аннотации
2. ORM
3. Hibernate
4. Консультация

36
Вопросы
1. История и особенности языка Java.
2. Платформа Java. Java Editions. GC, JVM, JDK, JRE. ByteCode.
3. Правила наи...
Спасибо за внимание
Виталий Чибриков
chibrikov@corp.mail.ru
Upcoming SlideShare
Loading in...5
×

Java осень 2013 лекция 8

170

Published on

Published in: Education
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
170
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
12
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Java осень 2013 лекция 8

  1. 1. Углубленное программирование на Java Лекция 8 «Базы данных» Виталий Чибриков
  2. 2. План лекции 1. JDBC 2. Statements 3. Transactions 4. DataSet & DAO 5. DB Service 2
  3. 3. Термины и сокращения JDBC Java Database Connectivity ORM Object Relational Mapping JPA Java Persistency API Hibernate DAO популярная библиотека для ORM, implements JPA Data Access Object 3
  4. 4. Инструменты http://dev.mysql.com/downloads/ MySQL Community Server MySQL Workbench MySQL Connector: Connector/J 4
  5. 5. JDBC Java Database Connectivity ― API для работы с базами из приложений на Java Предназначена для работы с реляционными базами данных Предоставляет методы для получения и обновления данных Не зависит от конкретного типа базы 5
  6. 6. JDBC Driver Manager Название класса драйвера: com.mysql.jdbc.Driver Создаем объект драйвера при помощи reflection: (Driver) Class.forName("com.mysql.jdbc.Driver").newInstance() java.sql.DriverManager – класс хелпер для работы с драйверами Регистрируем драйвер: DriverManager.registerDriver(driver); 6
  7. 7. JDBC API Connection Объект отвечает за соединение с базой и режим работы с ней Statement Объект представляет выражение обращения к базе ResultSet Объект с результатом запроса, который вернула база 7
  8. 8. Connection Создание Statement объекта Statement createStatement() – обычный запрос PreparedStatement prepareStatement() – запросы с параметрами CallableStatement prepareCall() – вызов хранимых процедур 8
  9. 9. Connection Транзакционность По-умолчанию auto-commit после выполнения каждого statement-а void setAutoCommit(boolean autoCommit) – вкл/выкл автокоммита void commit() void rollback() 9
  10. 10. Connection Driver driver = (Driver) Class.forName("com.mysql.jdbc.Driver").newInstance(); DriverManager.registerDriver(driver); StringBuilder url = new StringBuilder(); url. append("jdbc:mysql://"). append("localhost:"). append("3306/"). append("lecture_db?"). append("user=tully&"). append("password=tully"); //db type //host name //port //db name //login //password // URL: “jdbc:mysql://localhost:3306/lecture_db?user=tully&password=tully” Connection connection = DriverManager.getConnection(url.toString()); 10
  11. 11. Connection pool Обращение к базе происходит синхронно Поток посылает запрос к базе и ждет ответа Если в приложении много потоков обращаются к базе Можно собрать коннекты в connection pool Если приложение однопоточное или потоков мало Можно в каждом потоке держать открытый connection Connection Pool может быть сторонней библиотекой 11
  12. 12. План лекции 1. JDBC 2. Statements 3. Transactions 4. DataSet & DAO 5. DB Service 12
  13. 13. Statements JDBC позволяет создавать и выполнять запросы к базе Update statements: CREATE, DELETE, INSERT… Query statements: SELECT Интерфейсы Statement PreparedStatement CallableStatement Query statements возвращают ResultSet Update statements возвращают число измененных строк 13
  14. 14. ResultSet Содержит результат запроса Перемещение по строкам: next() previous() isLast() Доступ к полям текущей строки: По имени колонки: getBoolean(String name), getLong(String name)… По индексу колонки: getBoolean(int index), getLong(int index)… 14
  15. 15. Executor Объект, который содержит методы для работы с запросами Обработка запроса на создание, вставку, обновление и удаление execUpdate(Connection connection, String update) Обработка запроса на получение данных execQuery(Connection connection, String query, ResultHandler handler) public interface ResultHandler { void handle(ResultSet result) throws SQLException; } 15
  16. 16. Update Statement 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
  17. 17. Select Statement 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
  18. 18. Вызов execQuery String query = “select * from users where name = ‘tully’”; execQuery(connection, query, new ResultHandler(){ public void handle(ResultSet result) throws SQLException { result.next(); System.out.append("User: " + result.getString("name") + 'n'); } }); 18
  19. 19. close() Все обращения надо закрывать вручную resultSet.close() statement.close() connection.close() 19
  20. 20. План лекции 1. JDBC 2. Statements 3. Transactions 4. DataSet & DAO 5. DB Service 20
  21. 21. Transactions 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) {} } } 21
  22. 22. Prepared Statements 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(); } } 22
  23. 23. Типизация 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; } } 23
  24. 24. Типизация 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'); 24
  25. 25. План лекции 1. JDBC 2. Statements 3. Transactions 4. DataSet & DAO 5. DB Service 25
  26. 26. DataSet DataSet ― объект содержащий данные одной строки таблицы На каждую таблицу свой DataSet Извлечние и встаку данных удобно проводить через DataSet-ы В терминах JPA DataSet это Entity 26
  27. 27. DataSet public class UsersDataSet { private long id; private String name; public UsersDataSet(long id, String name){ this.id = id; this.name = name; } public UsersDataSet(String name){ this.id = -1; this.name = name; } public String getName() { return name; } public long getId() { return id; } } 27
  28. 28. DAO Data Access Object Объект доступа к данным Шаблон проектирования скрывающий детали работы с базой Обычно один DAO на одну таблицу Высокоуровневый доступ к данным через DataSet-ы Варианты операций над базой: Вставка строки ― добавление DataSet Поиск строки по ключу ― возврат DataSet-а Поиск строк по признаку ― возврат List<DataSet> Удаление строки 28
  29. 29. interface UsersDAO public interface UsersDAO { UsersDataSet get(long id) throws SQLException; UsersDataSet getByName(String name) throws SQLException; void add(UsersDataSet dataSet) throws SQLException; void delete(long id) throws SQLException; } 29
  30. 30. План лекции 1. JDBC 2. Statements 3. Transactions 4. DataSet & DAO 5. DB Service 30
  31. 31. Database Service DatabaseService ― служба в отдельном потоке TExecutor ― класс с типизированными методами для работы с запросами Для каждой страницы TableDAO ― объект доступа к данным таблицы с именем Table TableDataSet ― объект с данными одной строки таблицы с именем Table 31
  32. 32. Database Service DatabaseService ― служба в отдельном потоке. Abonent Каждый DatabaseService при старте открывает Connection к базе Базовое задание ― один DatabaseService * N DatabaseService ** N DatabaseService использующие M Connection из ConnectionPool 32
  33. 33. Executor Executor ― класс с типизированными методами для работы с запросами *Поддерживает транзакционность **Поддерживает prepared statements 33
  34. 34. DAO и DataSet UsersDAO ― объект доступа к данным таблицы USERS UsersDataSet ― объект с данными одной строки таблицы USERS *ResultsDAO ― объект доступа к данным таблицы RESULTS *ResultsDataSet ― объект с данными одной строки таблицы RESULTS public UsersDAO(Connection connection){…} 34
  35. 35. Билеты 38. JDBC API. 39. class Connection из JDBC API. Задачи которые решает Connection. 40. Dependency Injection. Использование при работе с базами данных. 41. class Statement из JDBC API. Задачи которые решает Statement. 42. class ResultSet из JDBC API. Обработка ответа от базы. 43. DataSet (элемент ORM). 44. DAO (элемент ORM). 35
  36. 36. На следующей лекции 1. Аннотации 2. ORM 3. Hibernate 4. Консультация 36
  37. 37. Вопросы 1. История и особенности языка Java. 2. Платформа Java. Java Editions. GC, JVM, JDK, JRE. ByteCode. 3. Правила наименований. Запуск java приложений. 4. class Object и class Class<?>. 5. Простые типы в Java. Классы обертки простых типов. 6. Generic programming в Java. 7. Коллекции в Java. Iterator, Iterable. 8. Processes and Threads. 9. Interface Runnable. class Thread. Методы start() и run(). 10. Методы класса Thread: sleep(), interrupt(), join(). 11. Ключевые слова volatile и synchronized. 12. Atomic variables. 13. Проблемы многопоточного доступа к данным. Race condition. 14. Методы класса Object: wait(), notify() и notifyAll(). 15. Плюсы и минусы многопоточных приложений. 16. Способы взаимодействия потоков. 17. java.util.concurrent 18. MessageSystem. Address и Abonent. 19. Распределение классов по пакетам. Циклические зависимости. 20. Архитектура игрового сервера. 21. Процесс работы игрового сервера, репликация. 22. Виды тестирования. 23. GC. Виды GC. Параметры GC. 24. Работа со случайными числами. 25. Singleton и Context. 26. Events, подписка на события. 27. Exception и Throwable. 28. Передача функции в библиотеку. Callback. 29. Анонимные классы. 30. Работа со временем и датой. Unix time. Locale. 31. I/O Streams. Потоки байт и потоки символов. 32. Сериализация/десериализация. Interface Serializable. 33. Ключевое слово transient. 34. Reflection. Роль reflection в сериализации. 35. SAX парсер. 36. DOM парсер. 37. ResourceFactory. Роль ресурсов в игре. 38. JDBC API. 39. class Connection. 40. Statement. 41. ResultSet. 42. DataSet. 43. DAO. 44. Annotation. 45. Object Relational Mapping. 46. Frontend. 47. MessageSystem иерархия наследования. 48. Game Mechanics. 49. Resource System. 50. Database System. 37
  38. 38. Спасибо за внимание Виталий Чибриков chibrikov@corp.mail.ru
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×