Скомпилированные запросы используют специальный синтаксис, понятный базе данных.Они обычно добавляют заполнители для параметров, таких как:
select * from applicant where name = ?
select * from applicant where name = :name
Точный синтаксис зависит от конкретной технологии: JDBC, ODBC и т. Д.
Теперь, когда эти запросы отправляются в базу данных(без конкретных значений параметров) база данных «сохраняет» их.Позже (обычно в одном сеансе базы данных) вы можете запускать их много раз, просто каждый раз предоставляя значения параметров.
Безопасность SQL-инъекций
Онитакже безопасен от SQL-инъекций.Например, если в предыдущем запросе вместо простого значения, такого как Mary
, вы использовали значение x'; delete from applicant; --
, база данных будет работать безопасно.Он будет работать примерно так:
select * from applicant where name = 'x; delete from applicant; --'
Этот запрос, вероятно, ничего не найдет и будет безопасным.
Если вместо этого вы не используете скомпилированный запрос, а просто решили объединитьSQL в виде строки вы бы сделали что-то вроде:
String sql = "select * from applicant where name = '" + param1 + "'";
И в конечном итоге с запросом UNSAFE:
select * from applicant where name = 'x'; delete from applicant; --
Этот будет выполнять два запроса.Второй удалит всю информацию из вашей таблицы.Наверное, не то, что вы хотите.