2.53M
Категория: ПрограммированиеПрограммирование

Spring Data

1.

Spring Data
astondevs.ru

2.

Spring Data
Spring Data — дополнительный удобный механизм для
взаимодействия с сущностями базы данных, организации их в
репозитории, извлечение данных, изменение, в каких то случаях для
этого будет достаточно объявить интерфейс и метод в нем, без
имплементации
В мире Java EE стандартом дефакто для работы с базами данных
является JPA (Java Persistence API). Spring Data JPA, будучи частью
Spring Data, реализует взаимодействие с реляционными СУБД,
основываясь на JPA.

3.

Модули

4.

Модули

5.

Repository
Главными компонентами для взаимодействий с БД в Spring Data
являются репозитории. Каждый репозиторий работает со своим
классом-сущностью. Самым простым способом создания репозитория
является создание интерфейса с наследованием от CrudRepository

6.

Repository
CrudRepository, указанный в примере, предоставляет базовый
набор методов для доступа к данным. Данный интерфейс является
универсальным и может быть использован не только в связке с JPA.
Repository — базовый тип репозиториев, не содержит каких-либо
методов, так же является универсальным.
PagingAndSortingRepository — универсальный интерфейс,
расширяющий CrudRepository и добавляющий поддержку пейджинации
и сортировки.
JpaRepository — репозиторий, добавляющий возможности,
специфичные для JPA.

7.

Нетривиальные Reposotiry
QueryDslJpaRepository — реализация JpaRepository для
взаимодействия с QueryDsl.
SimpleJpaRepository — простая реализация JpaRepository.

8.

Диаграмма классов

9.

Зависимости
Стандартная
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
<version>1.11.0.RELEASE</version>
</dependency>
Spting Boot стартер
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

10.

Примеры работы с Spring Data
Опишем простую сущность
Person

11.

Примеры работы с Spring Data
Для использования Spring Data - нам достаточно написать
репозиторий, который будет работать с нашей сущностью и
унаследоваться от CrudRepository.
public interface PersonRepository extends CrudRepository<Person, String>
CrudRepository - параметризированный интерфейс, который
принимает типа сущности и тип id сущности

12.

Запросы в Spring Data
Один из подходов - описать именованный запрос в классесущности используя аннотацию @NamedQuery в классе-сущности
Далее нужно будет добавить этот в репозиторий

13.

Запросы в Spring Data
Более распространенный способ - использование аннотации
@Query

14.

Запросы в Spring Data
Кроме того CrudRepository изначально поставляет ряд
стандартных методов

15.

Запросы по имени метода в
Spring Data
Ещё один способ создания запросов, реализованный в Spring Data
— запросы по имени метода.
Если в репозитории существуют методы, поведение которых не
описано именованными запросами, а так же имена которых начинаются
с findBy, countBy или deleteBy, то Spring Data автоматически
преобразует их именованные запросы.
Например, следующий метод будет преобразован в запрос «from
Person p where name like ?»:

16.

Образование запросов в Spring
Data

17.

Образование запросов в Spring
Data

18.

Образование запросов в Spring
Data

19.

Пользовательские реализации для
репозитория
Предположим что в репозиторие нужен метод, который не
получается описать именем метода, тогда можно реализовать с
помощью своего интерфейса и класса его имплементирующего.
Например ниже нам нужен метод получения сотрудников с
максимальной оплатой труда. Опишем интерфейс с этим методом
public interface CustomizedEmployees<T> {
List<T> getEmployeesMaxSalary();
}

20.

Пользовательские реализации для
репозитория
Напишем реализацию для интерфейса. С помощью HQL (SQL)
получаю сотрудников с максимальной оплатой.
public class CustomizedEmployeesImpl implements CustomizedEmployees {
@PersistenceContext
private EntityManager em;
@Override
public List getEmployeesMaxSalary() {
return em.createQuery("from Employees where salary = (select max(salary) from
Employees )", Employees.class).getResultList();
}
}

21.

Пользовательские реализации для
репозитория
Далее при описании нашего репозитория - импелментим этот
интерфейс тоже
@Repository
public interface CustomizedEmployeesCrudRepository extends CrudRepository<Employees, Long>,
CustomizedEmployees<Employees>
Есть одна важная особенность. Класс имплементирующий
интерфейс, должен заканчиваться (postfix) на Impl, или в конфигурации
надо поставить свой postfix
<repositories base-package="com.repository" repository-impl-postfix="MyPostfix" />
English     Русский Правила