Similar presentations:
Spring Data
1.
Spring Dataastondevs.ru
2.
Spring DataSpring Data — дополнительный удобный механизм для
взаимодействия с сущностями базы данных, организации их в
репозитории, извлечение данных, изменение, в каких то случаях для
этого будет достаточно объявить интерфейс и метод в нем, без
имплементации
В мире Java EE стандартом дефакто для работы с базами данных
является JPA (Java Persistence API). Spring Data JPA, будучи частью
Spring Data, реализует взаимодействие с реляционными СУБД,
основываясь на JPA.
3.
Модули4.
Модули5.
RepositoryГлавными компонентами для взаимодействий с БД в Spring Data
являются репозитории. Каждый репозиторий работает со своим
классом-сущностью. Самым простым способом создания репозитория
является создание интерфейса с наследованием от CrudRepository
6.
RepositoryCrudRepository, указанный в примере, предоставляет базовый
набор методов для доступа к данным. Данный интерфейс является
универсальным и может быть использован не только в связке с JPA.
Repository — базовый тип репозиториев, не содержит каких-либо
методов, так же является универсальным.
PagingAndSortingRepository — универсальный интерфейс,
расширяющий CrudRepository и добавляющий поддержку пейджинации
и сортировки.
JpaRepository — репозиторий, добавляющий возможности,
специфичные для JPA.
7.
Нетривиальные ReposotiryQueryDslJpaRepository — реализация 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.
Образование запросов в SpringData
17.
Образование запросов в SpringData
18.
Образование запросов в SpringData
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" />