Java осень 2013 лекция 8
-
Upload
technopark -
Category
Education
-
view
178 -
download
4
Transcript of Java осень 2013 лекция 8
Углубленное программирование
на JavaЛекция 8
«Базы данных»
Виталий Чибриков
План лекции
2
1. JDBC
2. Statements
3. Transactions
4. DataSet & DAO
5. DB Service
Термины и сокращения
3
JDBC Java Database Connectivity
ORM Object Relational Mapping
JPA Java Persistency API
Hibernate популярная библиотека для ORM, implements JPA
DAO Data Access Object
Инструменты
4
MySQL Community Server
MySQL Workbench
MySQL Connector: Connector/J
http://dev.mysql.com/downloads/
JDBC
5
Java Database Connectivity ― API для работы с базами из приложений на Java
Предназначена для работы с реляционными базами данных
Предоставляет методы для получения и обновления данных
Не зависит от конкретного типа базы
JDBC Driver Manager
6
Название класса драйвера: com.mysql.jdbc.Driver
(Driver) Class.forName("com.mysql.jdbc.Driver").newInstance()
Создаем объект драйвера при помощи reflection:
java.sql.DriverManager – класс хелпер для работы с драйверами
Регистрируем драйвер:
DriverManager.registerDriver(driver);
ResultSet
Connection
JDBC API
7
Объект отвечает за соединение с базой и режим работы с ней
Объект с результатом запроса, который вернула база
Statement
Объект представляет выражение обращения к базе
Connection
8
Создание Statement объекта
Statement createStatement() – обычный запрос
CallableStatement prepareCall() – вызов хранимых процедур
PreparedStatement prepareStatement() – запросы с параметрами
Connection
9
Транзакционность
По-умолчанию auto-commit после выполнения каждого statement-а
void setAutoCommit(boolean autoCommit) – вкл/выкл автокоммита
void commit()
void rollback()
Connection
10
Driver driver = (Driver) Class.forName("com.mysql.jdbc.Driver").newInstance();DriverManager.registerDriver(driver);
StringBuilder url = new StringBuilder();
url.append("jdbc:mysql://"). //db typeappend("localhost:"). //host nameappend("3306/"). //portappend("lecture_db?"). //db nameappend("user=tully&"). //loginappend("password=tully"); //password
// URL: “jdbc:mysql://localhost:3306/lecture_db?user=tully&password=tully”
Connection connection = DriverManager.getConnection(url.toString());
Обращение к базе происходит синхронно
Connection pool
11
Поток посылает запрос к базе и ждет ответа
Если в приложении много потоков обращаются к базе
Можно собрать коннекты в connection pool
Если приложение однопоточное или потоков мало
Можно в каждом потоке держать открытый connection
Connection Pool может быть сторонней библиотекой
План лекции
12
1. JDBC
2. Statements
3. Transactions
4. DataSet & DAO
5. DB Service
Statements
13
JDBC позволяет создавать и выполнять запросы к базе
Update statements: CREATE, DELETE, INSERT…
Query statements: SELECT
Интерфейсы
Statement
PreparedStatement
CallableStatement
Query statements возвращают ResultSet
Update statements возвращают число измененных строк
ResultSet
14
Содержит результат запроса
Доступ к полям текущей строки:
По имени колонки: getBoolean(String name), getLong(String name)…
По индексу колонки: getBoolean(int index), getLong(int index)…
Перемещение по строкам:
next()
previous()
isLast()
Executor
15
Объект, который содержит методы для работы с запросами
execUpdate(Connection connection, String update)
execQuery(Connection connection, String query, ResultHandler handler)
Обработка запроса на создание, вставку, обновление и удаление
Обработка запроса на получение данных
public interface ResultHandler {void handle(ResultSet result) throws SQLException;
}
Update Statement
16
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
17
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
18
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');
}
});
Все обращения надо закрывать вручную
close()
19
resultSet.close()
statement.close()
connection.close()
План лекции
20
1. JDBC
2. Statements
3. Transactions
4. DataSet & DAO
5. DB Service
Transactions
21
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
22
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();
}}
Типизация
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;
}}
Типизация
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');
План лекции
25
1. JDBC
2. Statements
3. Transactions
4. DataSet & DAO
5. DB Service
DataSet
26
DataSet ― объект содержащий данные одной строки таблицы
На каждую таблицу свой DataSet
Извлечние и встаку данных удобно проводить через DataSet-ы
В терминах JPA DataSet это Entity
DataSet
27
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; }}
Data Access Object
DAO
28
Объект доступа к данным
Шаблон проектирования скрывающий детали работы с базой
Обычно один DAO на одну таблицу
Высокоуровневый доступ к данным через DataSet-ы
Варианты операций над базой:
Вставка строки ― добавление DataSet
Поиск строки по ключу ― возврат DataSet-а
Поиск строк по признаку ― возврат List<DataSet>
Удаление строки
interface UsersDAO
29
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;
}
План лекции
30
1. JDBC
2. Statements
3. Transactions
4. DataSet & DAO
5. DB Service
Database Service
31
DatabaseService ― служба в отдельном потоке
TExecutor ― класс с типизированными методами для работыс запросами
Для каждой страницы
TableDAO ― объект доступа к данным таблицы с именем Table
TableDataSet ― объект с данными одной строки таблицы с именем Table
Database Service
32
DatabaseService ― служба в отдельном потоке. Abonent
Каждый DatabaseService при старте открывает Connection к базе
Базовое задание ― один DatabaseService
* N DatabaseService
** N DatabaseService использующие M Connection из ConnectionPool
Executor
33
Executor ― класс с типизированными методами для работы с запросами
*Поддерживает транзакционность
**Поддерживает prepared statements
DAO и DataSet
34
UsersDAO ― объект доступа к данным таблицы USERS
UsersDataSet ― объект с данными одной строки таблицы USERS
*ResultsDAO ― объект доступа к данным таблицы RESULTS
*ResultsDataSet ― объект с данными одной строки таблицы RESULTS
public UsersDAO(Connection connection){…}
Билеты
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).
На следующей лекции
36
1. Аннотации
2. ORM
3. Hibernate
4. Консультация
Вопросы
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.concurrent18. 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.
Спасибо за внимание
Виталий Чибриков[email protected]