Несмотря на огромное число разнообразных сайтов, практически всю веб разработку можно свести к CRUD операциям. CRUD – широко распространенный термин, означающий 4 стандартные операции над любой сущностью (ресурсом): создание, чтение, обновление и удаление. Например, в случае с пользователем можно составить такое соответствие:
Точно так же можно расписать действия над любыми другими ресурсами: фотографиями пользователя, его друзьями, сообщениями и т.п.
В одном из предыдущих уроков мы уже начинали строить CRUD сущности и данные хранили в памяти компьютера. В этом уроке мы продолжим работать с CRUD, но будем хранить данные в базе и работать с ними при помощи JDBC
JDBC – это стандарт взаимодействия Java-приложений с реляционными базами данных. Он управляет подключением к базе данных, выполнением запросов и обработкой данных, полученных из базы. Соединение с базой данных описывается классом, реализующим интерфейс java.sql.Connection
. Получив соединение с базой данных, мы можем создавать объекты класса java.sql.Statement
, которые представляют собой запросы к базе. Интерфейс java.sql.ResultSet
позволяет обрабатывать результат выполненного запроса.
Рассмотрим основные операции работы с сущностью
Создание сущности, включает в себя два действия: отображение формы и обработка данных формы. За каждое из этих действий отвечает свой собственный маршрут. В этой и других операциях работы с сущностью работа с формами и обработка данных формы остаются неизменными. Отличия будут заключаться только в процессе работы с данными в базе, на этом и остановимся подробнее
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;
}
}
Вывод списка чего-либо и отображение конкретной сущности мы уже рассматривали, поэтому подробно останавливаться на этом не будем. Действия при выводе списка всегда проходят по одному сценарию:
При выводе страницы конкретной сущности порядок действий, как и в случае со списком, тоже всегда одинаков:
Обновление, как и создание сущности, включает в себя два действия: отображение формы и обработка данных формы
// Обработка формы
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;
}
Удаление устроено даже проще чем вывод. В процессе удаления есть интерфейсный момент. Кнопка удаления ни в коем случае не должна сразу удалять. Человеку свойственно ошибаться и вероятность, что он нажмёт на эту кнопку по ошибке, крайне высока. Правильный подход состоит в том, чтобы спросить у пользователя, уверен ли он в том, что хочет удалить. Если да, то только в этом случае удалять.
@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. Если они видят обычную ссылку, то подразумевается что она не может выполнить деструктивных действий, а значит её можно посетить
Вам ответят команда поддержки Хекслета или другие студенты.
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.
Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно
Наши выпускники работают в компаниях:
Зарегистрируйтесь или войдите в свой аккаунт
Задавайте вопросы, если хотите обсудить теорию или упражнения. Команда поддержки Хекслета и опытные участники сообщества помогут найти ответы и решить задачу