Лекция 5. Работа с базами данных (JDBC и JPA)
Архитектура Java EE приложений
Java EE приложения разделены по функциональному принципу на изолированные модули. Обычно делятся на три уровня (как у Фаулера):
- Клиентский уровень
- Промежуточный уровень (BLL) — Business Logic Layer
- Уровень доступа к данным (DAL)
Технологии уровня доступа к данным
- JDBC — Java Database Connectivity API
- JPA — Java Persistence API
- Java EE Connector Architecture
- JTA — Java Transaction API
JDBC — Java Database Connectivity
Низкоуровневое API для доступа к данным в хранилищах. Типичное использование — написание SQL-запросов к конкретной базе.
JDBC Driver Manager
Java-приложение общается с БД через JDBC Driver — набор классов, реализующих JDBC API для конкретной СУБД.
Драйвер выбирается через DriverManager. Можно использовать In-Memory-DB, NoSQL-DB или базу, встроенную в Android-приложение — Java-разработчика эти нюансы не касаются, DriverManager сам выберет подходящий драйвер.
Connection String
Для подключения протокола JDBC API:
jdbc:mysql://localhost:3306/db_scheme
mysql— протокол работы с серверомlocalhost— имя хоста в сети3306— портdb_scheme— имя схемы (БД)
Установка JDBC Driver
Драйвер для конкретной БД нужно установить через систему сборки:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.29</version>
</dependency>
Statements
SQL-запросы делятся на две группы:
| Группа | Операторы | Метод |
|---|---|---|
| Получение данных | SELECT | executeQuery() — возвращает ResultSet |
| Изменение данных | INSERT, UPDATE, DELETE | executeUpdate() — возвращает число изменённых строк |
Callable Statements
CallableStatement используется для вызова хранимых процедур в БД. Хранимая процедура похожа на функцию класса, но находится в базе данных. Тяжёлые операции с БД могут выиграть в производительности при выполнении в том же пространстве памяти, что и сервер БД.
DataSource и ConnectionPoolDataSource
Интерфейсы из пакета javax.sql, реализуемые поставщиками JDBC-классов.
Основное назначение: предоставить возможность получения соединения с БД абстрагируясь от местоположения сервера СУБД и типа драйвера.
Объекты DataSource используются для получения физического соединения с БД и являются альтернативой DriverManager — нет необходимости регистрировать драйвер. Достаточно установить параметры соединения и вызвать getConnection().
JTA — Java Transaction API
API для определения и управления транзакциями, включая распределённые транзакции, а также транзакции, затрагивающие множество хранилищ данных.
JPA — Java Persistence API
JPA — спецификация Java EE и Java SE, описывающая систему управления сохранением Java-объектов в таблицы реляционных БД. Гораздо более высокоуровневое API по сравнению с JDBC — скрывает всю его сложность.
JDO vs JPA
JDO (Java Data Objects) — более общая спецификация ORM для любых баз и хранилищ. JPA можно рассматривать как часть JDO, специализированную на реляционных базах.
Hibernate
Hibernate — самая популярная open-source реализация JPA (де-факто стандарт). JPA только описывает правила и API, а Hibernate реализует эти описания. Hibernate имеет дополнительные возможности, не описанные в JPA (и не переносимые на другие реализации).
JPA Entity
Entity — это легковесный хранимый объект бизнес-логики (persistent domain object). Основная программная сущность — entity-класс. Может использовать дополнительные вспомогательные классы.
Жизненный цикл Entity
У Entity четыре статуса:
- new — объект создан, ещё нет сгенерированных первичных ключей, не сохранён в БД
- managed — объект создан, управляется JPA, имеет первичные ключи
- detached — объект был создан, но не управляется (или больше не управляется) JPA
- removed — объект создан, управляется JPA, но будет удалён после коммита транзакции
JPA EntityManager
EntityManager — главный интерфейс для работы с JPA. Описывает API для всех основных операций.
Группы операций EntityManager
1. Операции над Entity:
persist— сохранение нового объектаmerge— слияние с существующимremove— удалениеrefresh— обновление из БДdetach— отсоединение от управленияlock— блокировка
2. Получение данных:
find— поиск по ключуcreateQuery,createNamedQuery,createNativeQuery— создание запросовcontains— проверка наличияcreateNamedStoredProcedureQuery,createStoredProcedureQuery— вызов процедур
3. Получение других сущностей JPA:
getTransaction— транзакцияgetEntityManagerFactory— фабрикаgetCriteriaBuilder— построитель критериевgetMetamodel— метамодельgetDelegate— делегат
4. Работа с EntityGraph:
createEntityGraph,getEntityGraph
5. Общие операции:
close,isOpen,getProperties,setProperty,clear