Статьи

Как использовать Spring Data JPA с Spring Boot 2

Как вы, возможно, уже знаете, Spring Data JPA является частью более широкого семейства Spring Data. В этой статье мы будем использовать Spring Data JPA вместе с Spring Boot для взаимодействия с базой данных MariaDB.

зависимости

С Spring Boot:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

конфигурация

Файл application.properties представлен в файле src / main / resources для настройки, как показано ниже:

spring.jpa.hibernate.ddl-auto=update
spring.datasource.url=jdbc:mysql://192.168.99.100:3306/test1
spring.datasource.username=root
spring.datasource.password=root
spring.jpa.database-platform=org.hibernate.dialect.MariaDBDialect
spring.jpa.show-sql=true

Сканирование или загрузка репозиториев JPA

  • Если пакет репозиториев является подпакетом основного пакета Spring Boot, то этого @SpringBootApplicationдостаточно, поскольку он содержит @EnableAutoConfiguration.
  • Но если пакет репозиториев не является подпакетом пакета основного класса Spring, в этом случае нам нужно объявить пакеты репозиториев, как показано здесь: @EnableJpaRepositories(basePackages = "com.springbootdev.examples.jpa.repositories")
    Это должно быть предоставлено в классе или SpringBootApplication классе конфигурации  .
  • Аналогично,  @EntityScan может использоваться, если пакет сущностей не является подпакетом основного пакета приложения Spring.

Создать репозиторий

Чтобы создать репозиторий, просто расширьте  JapRepository интерфейс. Он предоставляет множество методов по умолчанию.

Вот несколько полезных примеров кода для справки.

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import com.mysql.demo.entity.User;


public interface UserJpaRepository extends JpaRepository<User, Integer>{


}

Для этого интерфейса реализация не требуется. Он может быть напрямую введен и использован в классе обслуживания. Но если он не предоставляет метод, мы можем определить его и использовать — реализация не требуется.

public interface UserJpaRepository extends JpaRepository<User, Integer>{
List<User> findByName(String name);
}

Особенности репозитория JPA

Запрос DSL

преимущества

  1. Используйте работу, потраченную на создание ваших сущностей JPA.
  2. Меньше кода меньше, чтобы поддерживать
  3. Проверьте ваши запросы при запуске, а не во время выполнения. На изображении ниже мы определили метод  findByNames в интерфейсе, который является расширением  JpaRepository. Но у нашего класса сущностей есть имя параметра. Поэтому, когда мы пытаемся запустить приложение, мы получаем следующую ошибку: «Имя свойства не найдено ….»Интерфейс Jpa Query Dsl с неправильным именем параметра.PNG

Методы запроса

Парсер запросов будет соответствовать следующему:

  1. findBy ..: возвращает listfindBy..Is, findBy..Equals, findBy..Not, findBy..Like, findBy..NotLike, findBy..StartingWith, findBy..EndingWith, findBy..ConistingFor числовые типы данных: findBy ..LessThan, findBy..LessThanEquals, findBy..GreaterThan, сравнение findBy..GreaterThanEqualDate: findBy..Before, findBy..After, findBy..BetweenFor логическое сравнение: findBy..True, findBy..FalseNull проверяет: findBy. .IsNull, findBy..IsNotNullДля сравнения коллекций: In, notIn: findBy..In (Collection str), findBy..NotIn (Collection str) Игнорировать регистр: findBy..IgnoreCase, findBy..StartingWithIgnoreCaseOrder: findBy..OrderByCountryAsc, ..OrderByCountryDescДля ограничения результатов: findFirstBy .., findTop5By .., findDistinct..By..s
  2. queryBy ..
  3. readBy ..
  4. countBy ..
  5. getBy ..

Этот критерий использует имена атрибутов сущности JPA. И это включает в себя несколько критериев в сочетании с ‘И’ и ‘Or’Eg: findByStateAndCount (String sate, String countrys).

Аннотации запроса

Иногда имена методов dsl запроса становятся слишком длинными. Или иногда мы хотим использовать существующий JPQL. В этих сценариях мы можем использовать аннотацию запроса.

@Query("select u from User u where u.age > :age1 and u.age < :age2")
List<User> queryByAgeRange(@Param("age1") int age1, @Param("age2") int age2);

Именованный запрос

Именованный запрос определяется в классе Entity с  @NamedQuery аннотацией.
Например:@NamedQuery(name="Model.namedFindAllModelsByType", query="select m from Model m where m.modelType.name= :name")

Чтобы использовать именованный запрос в  JpaRepository интерфейсе, нам нужно сделать следующее:

  • Одним из способов является определение  JpaRepository метода интерфейса с помощью имени именованного запроса.
  • Другой способ — использовать  @Query аннотацию для  JapRepository определенного метода.

JPA Named Query

Родные Запросы

Чтобы пометить запрос как собственный, в аннотации запроса используйте собственный параметр = true.

Именованные собственные запросы

Это работает так же, как именованный запрос.

пагинация

Иногда для большого набора данных нам может потребоваться получить данные порциями. Затем мы можем перейти к нумерации страниц. Разбивка на страницы обеспечивается  PagingAndSortingRepository интерфейсом и  findAll(Pageable pag)  методом.

public Page<User> getAllUsers(int page, int size) {
return userRepo.findAll(PageRequest.of(page, size));
}

Сортировка

 PagingAndSortingRepository -> findAll(Sort sort) 

public List<User> getAllUsersSorted(String paramname) {
return userRepo.findAll(Sort.by(Sort.Direction.ASC,paramname));
}

Аудиторская проверка

Чтобы включить аудит JPA, используйте @EnableJpaAuditingв классе конфигурации.

Вот аннотации, используемые:

  •  @CreatedBy 
  •  @CreatedDate 
  •  @LastModifiedBy 
  •  @LastModifiedDate 

запирающий

Существует два типа стратегий блокировки:

  1. Оптимистическая блокировка : Достигается с помощью параметра версии в сущности и снабжается комментариями  @Version. Если номер версии не совпадает, киньте OptimisticLockingException.
  2. Пессимистическая блокировка : долгосрочная блокировка данных на время транзакции, не позволяющая другим получить доступ к данным, пока транзакция не будет зафиксирована.

Стратегия блокировки указывается для метода хранилища с использованием  @Lock аннотации.

@Lock(LockModeType.PESSIMISTIC_WRITE)
List<User> findByAgeOrName(int age, String name);

Пул подключений

Spring Boot 2 по умолчанию предоставляет пул Hikari Connection. По сравнению с другими провайдерами пулов соединений он очень легкий и имеет лучшую производительность.

Hikari Pool по сравнению с другими источниками данных предоставляет множество конфигураций. Его настройки начинаются с spring.datasource.hikari. Одна из необходимых конфигураций приведена ниже.

maxLifetime:

Это свойство контролирует максимальное время жизни соединения в пуле. Используемое соединение никогда не удаляется, только когда оно закрыто, оно затем удаляется. Для каждого отдельного соединения применяется небольшое отрицательное затухание, чтобы избежать массового вымирания в пуле. Мы настоятельно рекомендуем установить это значение, и оно должно быть на несколько секунд короче, чем ограничение времени соединения для любой базы данных или инфраструктуры.  Значение 0 указывает на отсутствие максимального срока службы (бесконечного срока службы), в зависимости от  idleTimeout настроек. По умолчанию: 1800000 (30 минут)

Подробная информация обо всех конфигурациях  https://github.com/brettwooldridge/HikariCP#configuration-knobs-baby

Это все на данный момент. Дайте нам знать, что вы подумали об этом руководстве по Spring Data JPA в комментариях ниже. Удачного кодирования!