Backend
October 11, 2023

Spring Data JPA: работа с базами данных через JPA

Что такое JPA?

JPA (Java Persistence API) - это специальный интерфейс в Java, который позволяет объектам Java соотноситься с таблицами в базе данных.

Например, у тебя есть класс Пользователь в коде. А в базе данных есть таблица users. JPA позволяет привязать класс Пользователь к таблице users - тогда объекты класса Пользователь будут соответствовать записям в таблице users.

Как это работает? В классе Пользователь нужно проставить специальные аннотации - это такие специальные пометки в коде. Они указывают, что это за класс и как он связан с таблицей в базе данных. Например, аннотация @Entity говорит, что этот класс - сущность, которая соответствует таблице в базе.

Аннотация @Id помечает поле, которое является primary key - уникальным идентификатором записи в таблице. Аннотация @Column связывает поле класса с колонкой в таблице базы данных.

И так далее, есть куча разных аннотаций в JPA, они позволяют полностью настроить соответствие классов и таблиц базы данных.

Зачем это нужно?

JPA нужен для того, чтобы можно было работать с данными в базе через объекты Java. Это называется объектно-реляционное отображение.

Без JPA приходится писать сложный SQL код, чтобы получить данные из базы или записать их туда. А с JPA можно просто создать объект Пользователь, вызвать метод save() - и объект автоматически сохранится в соответствующую таблицу users!

И наоборот, можно вызвать метод find() и получить объект Пользователь уже с данными из таблицы базы данных. Очень удобно и не нужно писать SQL вручную!

Почему JPA важен для Spring?

Теперь про Spring. Как ты знаешь, Spring - это популярный фреймворк для создания Java enterprise приложений. Такие приложения обычно много работают с базами данных.

Поэтому интеграция Spring и JPA - это отличное сочетание. JPA берет на себя работу с базой данных через объекты. А Spring предоставляет удобные инструменты для настройки и использования JPA.

В частности, в Spring есть проект Spring Data JPA - о нем я расскажу дальше.

Что такое Spring Data JPA?

Spring Data JPA - это часть большого проекта Spring Data. Он предоставляет дополнительные удобные инструменты для использования JPA в Spring приложениях.

Основные преимущества Spring Data JPA:

  • Автоматическое создание репозиториев для работы с данными. Репозиторий - это такой класс, который позволяет легко выполнять CRUD операции (Create, Read, Update, Delete - создать, читать, обновить, удалить).

Раньше приходилось писать этот класс вручную для каждой сущности. А Spring Data JPA генерирует его автоматически по имени сущности!

  • Удобный механизм запросов на основе методов. Можно создавать методы с нужными названиями - и Spring Data JPA автоматически будет генерировать SQL запросы для этих методов.
  • Простая интеграция Spring и JPA. Нет нужды писать код для их связывания - Spring Data JPA все настраивает автоматически.
  • Управление транзакциями - Spring Data JPA позволяет управлять транзакциями и сеансами работы с базой.

Как видишь, Spring Data JPA делает работу с данными гораздо проще и удобнее! Давай теперь разберем на примерах, как его использовать.

Подключение Spring Data JPA

Чтобы начать пользоваться Spring Data JPA, нужно подключить его к проекту Spring.

Создадим простое приложение на Spring Boot - это специальный модуль Spring, который позволяет легко и быстро создавать приложения.

В pom.xml файLE добавим зависимости:

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

Это подключит Spring Data JPA и все нужные библиотеки JPA - Hibernate, например.

Теперь нужно добавить настройки для подключения к базе данных. Делается это в application.properties:

spring.datasource.url=jdbc:postgresql://localhost:5432/mydatabase 
spring.datasource.username=postgres 
spring.datasource.password=password
spring.jpa.hibernate.ddl-auto=create-drop

Здесь мы указываем URL базы данных, данные для подключения и режим initialize - он будет автоматически создавать и удалять таблицы на основе наших сущностей.

Вот и все - теперь можно создавать сущности и репозитории!

Создание сущностей

Сущность - это класс, который будет соответствовать таблице в базе данных. Определяется просто:

@Entity 
public class User {

@Id 
@GeneratedValue 
private Long id;

@Column 
private String name;

@Column 
private int age;

// getters and setters
 }

Здесь мы использовали аннотации:

  • @Entity - помечает, что это сущность для JPA
  • @Id - primary key
  • @GeneratedValue - значение ключа будет генерироваться автоматически
  • @Column - отображение полей на колонки в таблице базы данных

По этому классу JPA автоматически создаст таблицу Users с колонками id, name и age.

Также можно настраивать связи между таблицами с помощью аннотаций @OneToMany, @ManyToOne и других.

Работа с репозиториями

Репозиторий в Spring Data JPA - это интерфейс, который содержит методы для работы с данными.

Интерфейс создается просто:

public interface UserRepository extends JpaRepository<User, Long> {
}

Здесь мы указываем, что это репозиторий для сущности User. А Long - тип ключа этой сущности.

И все! Благодаря наследованию от JpaRepository нам уже доступны основные CRUD методы:

  • save() - сохранить объект
  • findById() - найти по id
  • findAll() - получить все объекты
  • count() - посчитать объекты
  • delete() - удалить объект

Мы можем сразу начать использовать эти методы для работы с данными:

User user = new User(); 
user.setName("John");
userRepository.save(user);
User foundUser = userRepository.findById(1L);

Круто, правда? Все готово для работы с данными, не нужно писать лишний код!

Запросы в Spring Data JPA

Spring Data JPA позволяет легко писать запросы на основе методов репозитория.

Можно создавать методы с нужными названиями - и они будут автоматически преобразовываться в запросы.

Например, метод findByAge(int age) будет искать по полю age.

А метод findByNameStartingWith(String prefix) найдет имена, начинающиеся с заданного префикса.

Также можно писать запросы на основе JPQL - объектно-ориентированного языка запросов JPA:

@Query("SELECT u FROM User u WHERE u.age > :age") 
List<User> findOlderThan(@Param("age") int age);

Это избавляет от необходимости писать сложные запросы на SQL.

Транзакции в Spring Data JPA

Транзакции нужны, чтобы группа операций с данными выполнялась надежно.

Например, перевод денег с одного счета на другой должен либо выполниться полностью, либо не выполняться вообще.

В Spring Data JPA транзакции можно управлять с помощью аннотации @Transactional.

Если пометить ею метод сервиса, то все операции внутри метода будут объединены в одну транзакцию. Либо все пройдет успешно, либо если что-то не сработает - все откатится назад.

Таким образом данные всегда будут в целостности и согласованности!

Итог

В этой статье мы разобрали:

  • Зачем нужен JPA и как он работает
  • Как Spring Data JPA упрощает работу с данными
  • Как настроить проект и сущности
  • Как автоматически создавать репозитории
  • Как делать запросы на основе методов
  • Как управлять транзакциями

JPA и Spring Data JPA избавляют от рутинной работы и позволяют сосредоточиться на бизнес-логике, а не на технических деталях.

Надеюсь, эта статья помогла тебе получить представление об этих полезных технологиях!