38
Углубленное программирование на Java Лекция 8 «Базы данных» Виталий Чибриков

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

Embed Size (px)

Citation preview

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

Углубленное программирование

на JavaЛекция 8

«Базы данных»

Виталий Чибриков

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

План лекции

2

1. JDBC

2. Statements

3. Transactions

4. DataSet & DAO

5. DB Service

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

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

3

JDBC Java Database Connectivity

ORM Object Relational Mapping

JPA Java Persistency API

Hibernate популярная библиотека для ORM, implements JPA

DAO Data Access Object

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

Инструменты

4

MySQL Community Server

MySQL Workbench

MySQL Connector: Connector/J

http://dev.mysql.com/downloads/

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

JDBC

5

Java Database Connectivity ― API для работы с базами из приложений на Java

Предназначена для работы с реляционными базами данных

Предоставляет методы для получения и обновления данных

Не зависит от конкретного типа базы

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

JDBC Driver Manager

6

Название класса драйвера: com.mysql.jdbc.Driver

(Driver) Class.forName("com.mysql.jdbc.Driver").newInstance()

Создаем объект драйвера при помощи reflection:

java.sql.DriverManager – класс хелпер для работы с драйверами

Регистрируем драйвер:

DriverManager.registerDriver(driver);

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

ResultSet

Connection

JDBC API

7

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

Объект с результатом запроса, который вернула база

Statement

Объект представляет выражение обращения к базе

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

Connection

8

Создание Statement объекта

Statement createStatement() – обычный запрос

CallableStatement prepareCall() – вызов хранимых процедур

PreparedStatement prepareStatement() – запросы с параметрами

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

Connection

9

Транзакционность

По-умолчанию auto-commit после выполнения каждого statement-а

void setAutoCommit(boolean autoCommit) – вкл/выкл автокоммита

void commit()

void rollback()

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

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());

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

Обращение к базе происходит синхронно

Connection pool

11

Поток посылает запрос к базе и ждет ответа

Если в приложении много потоков обращаются к базе

Можно собрать коннекты в connection pool

Если приложение однопоточное или потоков мало

Можно в каждом потоке держать открытый connection

Connection Pool может быть сторонней библиотекой

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

План лекции

12

1. JDBC

2. Statements

3. Transactions

4. DataSet & DAO

5. DB Service

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

Statements

13

JDBC позволяет создавать и выполнять запросы к базе

Update statements: CREATE, DELETE, INSERT…

Query statements: SELECT

Интерфейсы

Statement

PreparedStatement

CallableStatement

Query statements возвращают ResultSet

Update statements возвращают число измененных строк

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

ResultSet

14

Содержит результат запроса

Доступ к полям текущей строки:

По имени колонки: getBoolean(String name), getLong(String name)…

По индексу колонки: getBoolean(int index), getLong(int index)…

Перемещение по строкам:

next()

previous()

isLast()

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

Executor

15

Объект, который содержит методы для работы с запросами

execUpdate(Connection connection, String update)

execQuery(Connection connection, String query, ResultHandler handler)

Обработка запроса на создание, вставку, обновление и удаление

Обработка запроса на получение данных

public interface ResultHandler {void handle(ResultSet result) throws SQLException;

}

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

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')");

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

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();

}

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

Вызов 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');

}

});

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

Все обращения надо закрывать вручную

close()

19

resultSet.close()

statement.close()

connection.close()

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

План лекции

20

1. JDBC

2. Statements

3. Transactions

4. DataSet & DAO

5. DB Service

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

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) {}}

}

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

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();

}}

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

Типизация

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;

}}

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

Типизация

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');

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

План лекции

25

1. JDBC

2. Statements

3. Transactions

4. DataSet & DAO

5. DB Service

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

DataSet

26

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

На каждую таблицу свой DataSet

Извлечние и встаку данных удобно проводить через DataSet-ы

В терминах JPA DataSet это Entity

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

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; }}

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

Data Access Object

DAO

28

Объект доступа к данным

Шаблон проектирования скрывающий детали работы с базой

Обычно один DAO на одну таблицу

Высокоуровневый доступ к данным через DataSet-ы

Варианты операций над базой:

Вставка строки ― добавление DataSet

Поиск строки по ключу ― возврат DataSet-а

Поиск строк по признаку ― возврат List<DataSet>

Удаление строки

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

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;

}

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

План лекции

30

1. JDBC

2. Statements

3. Transactions

4. DataSet & DAO

5. DB Service

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

Database Service

31

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

TExecutor ― класс с типизированными методами для работыс запросами

Для каждой страницы

TableDAO ― объект доступа к данным таблицы с именем Table

TableDataSet ― объект с данными одной строки таблицы с именем Table

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

Database Service

32

DatabaseService ― служба в отдельном потоке. Abonent

Каждый DatabaseService при старте открывает Connection к базе

Базовое задание ― один DatabaseService

* N DatabaseService

** N DatabaseService использующие M Connection из ConnectionPool

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

Executor

33

Executor ― класс с типизированными методами для работы с запросами

*Поддерживает транзакционность

**Поддерживает prepared statements

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

DAO и DataSet

34

UsersDAO ― объект доступа к данным таблицы USERS

UsersDataSet ― объект с данными одной строки таблицы USERS

*ResultsDAO ― объект доступа к данным таблицы RESULTS

*ResultsDataSet ― объект с данными одной строки таблицы RESULTS

public UsersDAO(Connection connection){…}

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

Билеты

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).

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

На следующей лекции

36

1. Аннотации

2. ORM

3. Hibernate

4. Консультация

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

Вопросы

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.

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

Спасибо за внимание

Виталий Чибриков[email protected]