Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Java: prepared, statement

В чём разница между Statement и PreparedStatement и почему PreparedStatement защищает от SQL-инъекций?

Вопрос проверяет понимание работы JDBC, безопасности запросов и причин возникновения SQL-инъекций.

Короткий ответ

Statement формирует SQL-запрос как строку, а PreparedStatement использует параметры. В PreparedStatement SQL и данные передаются отдельно. Это предотвращает интерпретацию пользовательского ввода как части SQL-кода. Кроме безопасности, PreparedStatement может быть быстрее за счёт повторного использования плана запроса. Поэтому его используют по умолчанию.

Длинный ответ

Работа с БД через JDBC требует внимательного отношения к безопасности.

Определение

Statement — интерфейс JDBC для выполнения SQL-запросов, сформированных как строка.
PreparedStatement — интерфейс JDBC для выполнения параметризованных SQL-запросов.

Statement

Запрос формируется целиком как строка.

Пример:

String sql = "SELECT * FROM users WHERE name = '" + name + "'";
Statement stmt = connection.createStatement();
stmt.executeQuery(sql);

Проблемы:

  1. Уязвимость к SQL-инъекциям

  2. Трудно экранировать данные

  3. План запроса не переиспользуется

PreparedStatement

SQL и параметры разделены.

Пример:

String sql = "SELECT * FROM users WHERE name = ?";
PreparedStatement ps = connection.prepareStatement(sql);
ps.setString(1, name);
ps.executeQuery();

Преимущества:

  1. Защита от SQL-инъекций

  2. Корректная обработка типов

  3. Возможность переиспользования плана запроса

Почему PreparedStatement защищает от инъекций

Важно понимать, что БД:

  1. Сначала парсит SQL

  2. Затем подставляет параметры как данные

  3. Не исполняет параметры как код

Даже если параметр содержит SQL:

' OR 1=1 --

он будет трактоваться как обычная строка.

Вывод

PreparedStatement — стандартный и безопасный способ работы с JDBC. Statement стоит использовать только в редких случаях с полностью контролируемым SQL.

Уровень

  • Рейтинг:

    5

  • Сложность:

    6

Навыки

  • Java

    Java

Ключевые слова

#prepared

#statement

Подпишись на Java Developer в телеграм