Статьи
YouTube-канал Отзывы

Удаление записи через DELETE-запрос в Spring Boot

Исходники

5 июля 2022

Тэги: Java, rest, Spring Boot, SQL, руководство.

Содержание

  1. Репозиторий
  2. Сервисный слой
  3. Контроллер

В статье Обновление записи через PUT-запрос в Spring Boot мы научились обновлять данные в БД. Теперь попробуем создать полноценный rest-интерфейс для удаления существующих записей.

За основу возьмём наше приложение из указанной статьи. Оно состоит из трёх слоёв: репозиторий (работа с БД), бизнес-логика приложения (service) и сам rest-интерфейс (controller), который обрабатывает входящий json и генерирует исходящий.

Репозиторий

Начнём с доработки репозитория (интерфейс ProfileRepository).

void deleteProfileById(int id);

Для удаления нам достаточно знать только id записи.

В реализацию интерфейса репозитория (ProfileRepositoryImpl) добавим sql-запрос в виде константы, которую принято размещать в начале класса:

private static final String SQL_DELETE_PROFILE = "delete from profile where id = :id";

Имена параметров, которые мы будем подставлять в sql-запрос, начинаются с двоеточия.

Вот реализация удаления записи в БД:

@Override
public void deleteProfileById(int id) {
    var params = new MapSqlParameterSource();
    params.addValue("id", id);
    jdbcTemplate.update(SQL_DELETE_PROFILE, params);
}

Всё предельно просто: передаём наш единственный параметр вместе с запросом в метод jdbcTemplate.update(), который вопреки своему названию отвечает вообще за любые изменения данных (и insert, и update, и delete). Обратите внимание, что jdbcTemplate у нас имеет тип NamedParameterJdbcTemplate – именно он позволяет использовать именованные параметры. Иначе пришлось бы писать знаки вопроса.

Сервисный слой

Перейдём к сервисному слою. Интерфейс ProfileService не отличается оригинальностью:

void deleteProfile(int id);

Его реализация в ProfileServiceImpl:

@Override
public void deleteProfile(int id) {
    var profile = profileRepository.getProfileById(id)
            .orElseThrow(() -> new ProfileNotFoundException(id));
    profileRepository.deleteProfileById(profile.id());
}

Здесь операцию нужно выполнить над уже существующей записью, поэтому перед вызовом надо проверить её наличие в БД. Если по каким-то причинам её там не нашлось – сразу кидаем исключение, которое будет преобразовано в соответствующий json благодаря ErrorController, который мы рассматривали в предыдущей статье.

Согласно архитектуре restful-сервисов, чтение данных мы делаем при помощи GET-запросов, а удаление – при помощи DELETE.

Контроллер

Перейдём к нашему контроллеру ProfileController и добавим в него метод удаления профиля.

@DeleteMapping(value = "/{personId:\\d+}")
public void deleteProfile(@PathVariable int personId) {
    profileService.deleteProfile(personId);
}

Аннотация @DeleteMapping говорит, что это обработчик DELETE-запроса, причём в адресной строке также требуется указать personId (после двоеточия указана регулярка, т.е. мы ожидаем любое количество цифр). Значение этого параметра будет помещено в соответствующую переменную благодаря @PathVariable.

Теперь мы готовы к тому, чтобы выполнить rest-запрос на создание новой записи в БД. Запускаем приложение и отравляем указанный DELETE-запрос по адресу http://127.0.0.1:8080/profiles/1, где 1 – это номер существующей записи. В http-заголовках обязательно указываем Content-Type: application/json.

В ответ в случае успеха получаем http-статус 200. Если же мы укажем id, которой нет в БД, то получим следующий ответ:

{
  "message": "Profile with id = 123 not found"
}

Таким образом, Spring Boot позволяет буквально за 5 минут создать полноценный обработчик DELETE-запроса с валидацией входящих параметров.


Облако тэгов

Kotlin, Java, Java 11, Java 8, Spring, Spring Boot, Spring Data, SQL, PostgreSQL, Oracle, Linux, Hibernate, Collections, Stream API, многопоточность, файлы, Nginx, Apache, maven, gradle, JUnit, YouTube, новости, руководство, ООП, алгоритмы, головоломки, rest, GraphQL, Excel, XML, json, yaml.

Последние статьи


Комментарии

Добавить комментарий

×

devmark.ru