Java JDBC: Работа с базой данных
Теория: Стейтменты
Как правило, запросы в базу формируются динамически на основе данных, которые поступают извне. Например, создание пользователя чаще всего происходит во время регистрации. В таком случае код вставки выглядит так:
Составленные таким образом запросы несут в себе серьезную опасность — SQL-инъекции. Вместо обычных данных злоумышленник может отправить текст, который изменит SQL-запрос. Представьте, что внутри переменной хранилась бы такая строка:
В таком случае после подстановки мы бы получили следующий запрос:
Фактически, вместо одного запроса получилось два. Таким образом, злоумышленник может выполнить произвольный запрос в базу данных — то есть удалить, добавить или изменить все, что ему хочется.
В разработке существует правило «Никогда не доверяй пользовательским данным» — оно особенно важно в работе с базами данных. Любые данные перед вставкой нужно экранировать с помощью подготовленных запросов:
Подготовленные запросы создаются с помощью плейсхолдеров. Это заполнители, которые расставляются в местах, где ожидается подстановка данных. При этом плейсхолдеры не нужно оборачивать в кавычки, если это строки. JDBC работает так:
- Автоматически выполняет подстановку
- Создает стейтмент
preparedStatement - Передает в него подготовленный SQL-шаблон
- Заполняет шаблон данными
- Вызывает его
Заполнение данными выполняется с помощью методов, похожих на те, которые используются в ResultSet. Разница только в том, что здесь конвертация происходит в обратную сторону. Каждый метод наподобие setString() принимает на вход два параметра:
- Порядковый номер плейсхолдера
- Данные, которые нужно подставить
Ускорение запросов
Кроме того, preparedStatement может ускорять запросы. Дело в том, что мы можем выполнять множество запросов подряд в рамках одного preparedStatement. За счет этого запрос готовится предварительно, что ускоряет работу:
Возврат идентификатора
Когда мы вставляем данные в базу, иногда нам нужно получить идентификатор вставленной записи и потом использовать его в коде. Это происходит, когда мы создаем какую-то сущность и хотим потом ее использовать:
Чтобы выполнить эту задачу, немного изменим запрос:
Рекомендуемые программы
Завершено
0 / 5

