Бесплатный курс по Java: от основ до продвинутого уровня
Создание 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() работает.