Как вы, возможно, уже знаете, 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);
}
Запрос DSL
преимущества
- Используйте работу, потраченную на создание ваших сущностей JPA.
- Меньше кода меньше, чтобы поддерживать
- Проверьте ваши запросы при запуске, а не во время выполнения. На изображении ниже мы определили метод
findByNames
в интерфейсе, который является расширениемJpaRepository
. Но у нашего класса сущностей есть имя параметра. Поэтому, когда мы пытаемся запустить приложение, мы получаем следующую ошибку: «Имя свойства не найдено ….»
Методы запроса
Парсер запросов будет соответствовать следующему:
- 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
- queryBy ..
- readBy ..
- countBy ..
- 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
определенного метода.
Родные Запросы
Чтобы пометить запрос как собственный, в аннотации запроса используйте собственный параметр = 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
запирающий
Существует два типа стратегий блокировки:
- Оптимистическая блокировка : Достигается с помощью параметра версии в сущности и снабжается комментариями
@Version
. Если номер версии не совпадает, киньтеOptimisticLockingException
. - Пессимистическая блокировка : долгосрочная блокировка данных на время транзакции, не позволяющая другим получить доступ к данным, пока транзакция не будет зафиксирована.
Стратегия блокировки указывается для метода хранилища с использованием @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 в комментариях ниже. Удачного кодирования!