Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером

Crud in DB Java: Веб-технологии

Несмотря на огромное число разнообразных сайтов, практически всю веб разработку можно свести к CRUD операциям. CRUD – широко распространенный термин, означающий 4 стандартные операции над любой сущностью (ресурсом): создание, чтение, обновление и удаление. Например, в случае с пользователем можно составить такое соответствие:

  • Create – регистрация нового пользователя
  • Read – Просмотр профиля пользователями сайта
  • Update – Обновление личных данных пользователя (смена емейла, пароля)
  • Delete – Удаление пользователя

Точно так же можно расписать действия над любыми другими ресурсами: фотографиями пользователя, его друзьями, сообщениями и т.п.

В одном из предыдущих уроков мы уже начинали строить CRUD сущности и данные хранили в памяти компьютера. В этом уроке мы продолжим работать с CRUD, но будем хранить данные в базе и работать с ними при помощи JDBC

JDBC – это стандарт взаимодействия Java-приложений с реляционными базами данных. Он управляет подключением к базе данных, выполнением запросов и обработкой данных, полученных из базы. Соединение с базой данных описывается классом, реализующим интерфейс java.sql.Connection. Получив соединение с базой данных, мы можем создавать объекты класса java.sql.Statement, которые представляют собой запросы к базе. Интерфейс java.sql.ResultSet позволяет обрабатывать результат выполненного запроса.

Рассмотрим основные операции работы с сущностью

Create

Создание сущности, включает в себя два действия: отображение формы и обработка данных формы. За каждое из этих действий отвечает свой собственный маршрут. В этой и других операциях работы с сущностью работа с формами и обработка данных формы остаются неизменными. Отличия будут заключаться только в процессе работы с данными в базе, на этом и остановимся подробнее

public class CompaniesServlet extends HttpServlet {

    @Override
    public void doPost(HttpServletRequest request,
                      HttpServletResponse response)
                throws IOException, ServletException {

        // Получаем соединение с базой данных
        // Соединение описывается интерфейсом Connection
        ServletContext context = request.getServletContext();
        Connection connection = (Connection) context.getAttribute("dbConnection");

        // Добавление новой компании в базу

        // Формируем запрос
        String query = "INSERT INTO companies (name) VALUES (?)";

        // Получаем данные из формы, в данном случае имя компании
        String name = "New company";

        // Если в процессе работы выброшено исключение SQLException,
        // Нужно установить в ответе статус 500
        try {
            // Получаем запрос к базе данных
            // Запрос представлен классом PreparedStatement
            PreparedStatement statement = connection.prepareStatement(query);
            statement.setString(1, name);

            // Выполняем запрос в базу данных
            statement.execute();

        } catch (SQLException e) {
            response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
            return;
        }
}

Read

Вывод списка чего-либо и отображение конкретной сущности мы уже рассматривали, поэтому подробно останавливаться на этом не будем. Действия при выводе списка всегда проходят по одному сценарию:

  1. Извлекаем список из базы данных
  2. Передаем данные в шаблон
  3. Выводим данные в шаблоне используя цикл

При выводе страницы конкретной сущности порядок действий, как и в случае со списком, тоже всегда одинаков:

  1. Из адреса извлекается идентификатор сущности
  2. Выполняется поиск сущности в базе по идентификатору
  3. Передаем данные сущности в шаблон
  4. В шаблоне выводим данные

Update

Обновление, как и создание сущности, включает в себя два действия: отображение формы и обработка данных формы

// Обработка формы
public void doPost(HttpServletRequest request,
                      HttpServletResponse response)
                throws IOException, ServletException {

        ServletContext context = request.getServletContext();
        Connection connection = (Connection) context.getAttribute("dbConnection");

        // Составляем запрос, который обновит данные компании с указанным id
        String query2 = "UPDATE companies SET name=? WHERE id=?";

        // Получаем id компании из пути
        String id = "5";

        // Из формы получаем обновленные данные компании
        String newName = "Company2"

        try {
            // Получаем запрос
            PreparedStatement statement = connection.prepareStatement(query2);
            statement.setString(1, newName);
            statement.setString(2, id);
            // Выполняем запрос
            statement.execute();

        } catch (SQLException e) {
            response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
            return;
        }

Delete

Удаление устроено даже проще чем вывод. В процессе удаления есть интерфейсный момент. Кнопка удаления ни в коем случае не должна сразу удалять. Человеку свойственно ошибаться и вероятность, что он нажмёт на эту кнопку по ошибке, крайне высока. Правильный подход состоит в том, чтобы спросить у пользователя, уверен ли он в том, что хочет удалить. Если да, то только в этом случае удалять.

@Override
public void doPost(HttpServletRequest request,
                    HttpServletResponse response)
            throws IOException, ServletException {

    ServletContext context = request.getServletContext();
    Connection connection = (Connection) context.getAttribute("dbConnection");

    // Формируем запрос на удаление компании из базы по ее идентификатору
    String query = "DELETE FROM companies WHERE id=?";

    // Получаем id компании из пути
    String id = "5";

    try {
        PreparedStatement statement = connection.prepareStatement(query);
        statement.setString(1, id);
        statement.execute();

    } catch (SQLException e) {
        response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
        return;
    }
}

Отдельно стоит сказать, что крайне важно соблюдать семантику HTTP. Ни в коем случае нельзя создавать HTML, в котором удаление происходит GET-запросом, например, по ссылке. Браузеры, их плагины и поисковые системы действуют в соответствии с семантикой HTTP. Если они видят обычную ссылку, то подразумевается что она не может выполнить деструктивных действий, а значит её можно посетить


Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты.

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы
Иконка программы Java-разработчик
Профессия
с нуля
Разработка приложений на языке Java
23 марта 10 месяцев

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»
Изображение Тото

Задавайте вопросы, если хотите обсудить теорию или упражнения. Команда поддержки Хекслета и опытные участники сообщества помогут найти ответы и решить задачу