Статьи
Утилиты Telegram YouTube Отзывы

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

Исходники

28 декабря 2023

Тэги: 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-запроса с валидацией входящих параметров.



Комментарии

05.09.2023 14:59 Иван

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

05.09.2023 23:55 devmark

Любой тип запроса (GET, POST, PUT, DELETE, PATCH и т.п.) можно отправить через Postman. Можете попробовать отправить без заголовока Content-Type.

"sql с возможностями CRUD" - вы имеете в виду веб-интерфейс в виде таблицы, где можно оперировать данными?

06.09.2023 08:40 Иван

Спасибо. Да, веб-интерфейс с возможностью оперировать данными. У вас ещё есть статьи где-нибудь, помимо youtube?

06.09.2023 23:48 devmark

Нет, на youtube у меня видео, на github примеры проектов, а статьи - на этом сайте. Ещё есть канал и бот Telegram.

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

×

devmark.ru