Создание Spring Boot Data CRUD-приложения

Создадим CRUD приложение, только теперь с использованием Spring Boot Data.

Создадим новое Spring Boot приложение с такими папками и файлами.

Содержимое файлов в этом crud приложении ничем не отличается от содержимого предыдущего crud приложения, которое мы создавали в прошлом уроке за исключением файла класса сервиса.

Также можно заметить, что DAO интерфейс и класс исчезли, а вместо них появился файл ActorRepository. Давайте же разберемся почему.

До сего момента мы делали Crud операции, только над актером.

А что если в нашем приложении нам придется совершать CRUD операции не только с ним, а и с другими сущностями?

Получается придется для каждой сущности писать DAO интерфейс и его реализацию с почти одинаковыми CRUD методами.

Spring Data избавит нас от этой головной боли!

Благодаря Spring Data, дао классы вообще не пишутся. Вместо этого для каждой сущности пишется один единственный интерфейс, наследующий от другого интерфейса, он называется JpaRepository<[сюда передаем имя класса сущности], [сюда тип ID сущности]> (ниже пример), а методы для простых CRUD операций уже реализованы за нас и мы просто используем их в сервисе. То есть Spring Data фактически дарит нам методы для работы с БД и вручную, как раньше, их писать не нужно.

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

package com.SpringBootApps.firstSpringBootCRUDApp.dao; import java.util.List; //Вот интерфейс о котором мы говорили. //Для каждой другой сущности пишется подобный. //Класс таблицы actor это Actor, а тип id в этой таблице как мы //помним это Integer. Поэтому передаем эти данные в JpaRepository. public interface ActorRepository extends JpaRepository { //А здесь, если для сущности актер нужны только самые //обычные Crud операции, можно даже ничего не писать!!! //Но обычно здесь пишутся методы со специальным именем //чтобы делать особенные запросы к таблице с актерами. }

Теперь давайте же воспользуемся этими подаренными Spring Data методами для совершения crud операций в сервисном классе.

package com.SpringBootApps.firstSpringBootDataCRUDApp.service; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.SpringBootApps.firstSpringBootDataCRUDApp.models.Actor; import com.SpringBootApps.firstSpringBootDataCRUDApp.repositories.ActorRepository; import java.util.Optional; @Service public class ServiceInterfaceImpl implements ServiceInterface { //Внедряем созданный интерфейс (вернее бин, который будет //создан на основе этого интерфейса за кулисами средствами //Spring Boot). Где-то там за кулисами ясное дело спринг //берет созданный нами интерфейс ActorRepository, реализует //его (то есть реализует методы, которые наш интерфейс //наследовал от интерфейса JpaRepository) и внедряет //объект(бин) реализованного класса сюда. @Autowired private ActorRepository actorRepository; @Transactional public Actor getActor(int actorID) { //.findById() – дается нам БЕСПЛАТНО! //То есть нам не нужно создавать метод для взаимодействия //с БД вручную как мы это делали раньше. Optional actor = actorRepository.findById(actorID); //Немного об Optional. Здесь вам просто нужно знать что //в Optional объекте может оказаться либо пустота либо //извлеченный по Id актер. Не будем углубляться. Optional //это просто дополнительная страховка на случай того //если actorRepository.findById(actorID) вернет null. if(actor.isPresent()) { //Если не пустая возвращаем актера. return actor.get(); } return null;//иначе null } @Transactional public void saveActor(Actor actor) { //.save() – БЕСПЛАТНО! actorRepository.save(actor); } @Transactional public List getListOfActors() { //.findAll() – БЕСПЛАТНО! return actorRepository.findAll(); } @Transactional public void deleteActor(int actorid) { //.deleteById() – БЕСПЛАТНО! actorRepository.deleteById(actorid); } }

Давайте протестируем данное Crud приложение.

В таблице actor сейчас три актера:

Для примера давайте протестируем обработчик getActors, который выбирает всех актеров из таблицы.

Как видим, все актеры были выбраны обработчиком getActors из БД успешно. Это значит, что подаренный Spring Data метод findAll() работает.

Создание Spring Boot Data Rest CRUD-приложения

Автоматизируйте CRUD с Spring Data REST. Минимум кода: без DAO, Service и Controller. Генерация REST-эндпоинтов и метаданных в JSON.
Time to read: 19

Что такое Docker и зачем он нужен?

Docker — инструмент для контейнеризации. Узнайте, как создавать, запускать и управлять приложениями в изолированных Docker-образах без лишних зависимостей.
Time to read: 13

Docker Hub: назначение и использование

Как работать с Docker Hub: загрузка образов, репозитории, теги версий. Примеры команд для скачивания и запуска контейнеров из облачного хранилища.
Time to read: 17