Подготовленный Оператор является немного более мощной версией Оператора, и должен всегда быть, по крайней мере, так же быстр и легок обработать как Оператор.
Подготовленный Оператор может быть параметризован
Большинство реляционных баз данных обрабатывает JDBC / SQL-запрос на четырех шагах:
Оператор будет всегда продолжаться через четыре шага выше для каждого SQL-запроса, отправленного в базу данных. Подготовленный Оператор предварительно выполняет шаги (1) - (3) в процессе выполнения выше. Таким образом при создании Подготовленного Оператора некоторая предварительная оптимизация сразу выполняется. Эффект состоит в том, чтобы уменьшить нагрузку на механизм базы данных во время выполнения.
Теперь мой вопрос состоит в том, что - "Каким-либо другим преимуществом использования является Подготовленный Оператор?"
нечего добавить,
1 - если вы хотите выполнить запрос в цикле (более 1 раза), подготовленный оператор может быть быстрее из-за оптимизации, о которой вы упомянули.
2 - параметризованный запрос - хороший способ избежать внедрения SQL, который доступен только в PreparedStatement.
PreparedStatement
- очень хорошая защита (но не надежная) для предотвращения атак SQL-инъекций . Значения параметров привязки - хороший способ защиты от нежелательного посещения "маленьких столиков Бобби" .
Преимущества PreparedStatement
:
Предварительная компиляция и кэширование на стороне БД оператора SQL приводит к общему более быстрому выполнению и возможности повторного использования Оператор SQL в пакетах .
Автоматическое предотвращение атак SQL-инъекций путем экранирования кавычек и других специальных символов. Обратите внимание, что для этого необходимо использовать любой из методов PreparedStatement
setXxx ()
для установки значений
prepareStatement = connection.prepareStatement ("INSERT INTO Person (имя, адрес электронной почты, дата рождения, фотография) ЦЕННОСТИ (?, ?, ?, ?)");
подготовленоStatement.setString (1, person.getName ());
подготовленоStatement.setString (2, person.getEmail ());
prepareStatement.setTimestamp (3, новая отметка времени (person.getBirthdate (). getTime ()));
подготовилStatement.setBinaryStream (4, person.getPhoto ());
подготовилStatement.executeUpdate ();
и, следовательно, не встраивают значения в строку SQL путем конкатенации строк.
prepareStatement = connection.prepareStatement ("INSERT INTO Person (name, email) VALUES ('" + person.getName () + "', '" + person.getEmail () + "'");
подготовилStatement.executeUpdate ();
Упрощает установку нестандартных объектов Java в строке SQL, например. Дата
, Время
, Отметка времени
, BigDecimal
, InputStream
( Blob
) и Читатель
( Clob
). Для большинства из этих типов вы не можете «просто» выполнить toString ()
, как вы сделали бы в простом операторе
.Вы даже можете провести рефакторинг всего этого, чтобы использовать PreparedStatement # setObject ()
внутри цикла, как показано в служебном методе ниже:
public static void setValues (PreparedStatement prepareStatement, Object ... values) выдает SQLException {
for (int i = 0; i
Что можно использовать, как показано ниже:
prepareStatement = connection.prepareStatement ("ВСТАВИТЬ В человека (имя, адрес электронной почты, дата рождения, фото) ЗНАЧЕНИЯ (?,?,?,?)");
setValues (подготовлено, person.getName (), person.getEmail (), new Timestamp (person.getBirthdate (). getTime ()), person.getPhoto ());
подготовилStatement.executeUpdate ();
Невозможно сделать CLOBs в Statement.
And: (OraclePreparedStatement) ps