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

Вернуться назад

26 апреля 2018

В статье Работа с БД в Spring Boot на примере postgresql мы узнали как читать данные из БД. Но чтение данных - это лишь малая часть всех операций, которые встречаются в типичном java-приложении. Теперь попробуем создать полноценный rest-интерфейс для удаления ранее добавленных записей.

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

Начнём с доработки dao-слоя (интерфейс ProfileDao).

    void deleteProfileById(int id);

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

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

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

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

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

    @Override
    public void deleteProfileById(int id) {
        MapSqlParameterSource 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) {
        Profile profile = profileDao.getProfileById(id)
                .orElseThrow(() -> new ProfileNotFoundException(id));
        profileDao.deleteProfileById(profile.getId());
    }

Здесь операцию нужно выполнить над уже существующей записью, поэтому перед вызовом надо проверить её наличие в БД. Если по каким-то причинам её там не нашлось - сразу кидаем исключение, которое будет преобразовано в соответствующий 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/profile/1, где 1 - это номер существующей записи. В http-заголовках обязательно указываем Content-Type: application/json.

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

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

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

Тэги: Java, SQL, Spring Boot, rest.


Исходники


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

Ваше имя:
Текст комментария: