Разница между выпиской и подготовленным состоянием - PullRequest
202 голосов
/ 17 июля 2010

Подготовленный оператор является несколько более мощной версией оператора и всегда должен быть по крайней мере таким же быстрым и простым в обращении, как оператор. Подготовленное заявление может быть параметризовано

Большинство реляционных баз данных обрабатывают запрос JDBC / SQL в четыре этапа:

  1. Разбор входящего SQL-запроса
  2. Скомпилируйте запрос SQL
  3. Планирование / оптимизация пути сбора данных
  4. Выполнить оптимизированный запрос / получить и вернуть данные

Оператор всегда будет проходить через четыре шага выше для каждого запроса SQL, отправляемого в базу данных. Подготовленный оператор предварительно выполняет шаги (1) - (3) в вышеописанном процессе выполнения. Таким образом, при создании подготовленного оператора некоторая предварительная оптимизация выполняется немедленно. Эффект заключается в уменьшении нагрузки на ядро ​​базы данных во время выполнения.

Теперь мой вопрос таков: «Есть ли какое-либо другое преимущество использования Подготовленного заявления?»

Ответы [ 15 ]

184 голосов
/ 18 июля 2010

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

  • Предварительная компиляция и кэширование на стороне DB оператора SQL приводят к общему ускорению выполнения и возможности его повторного использования.Оператор SQL в пакетах .

  • Автоматическое предотвращение SQL-инъекции атак путем встроенного экранирования кавычек и других специальных символов,Обратите внимание, что для этого необходимо использовать любой из методов PreparedStatement setXxx(), чтобы установить значения

    preparedStatement = connection.prepareStatement("INSERT INTO Person (name, email, birthdate, photo) VALUES (?, ?, ?, ?)");
    preparedStatement.setString(1, person.getName());
    preparedStatement.setString(2, person.getEmail());
    preparedStatement.setTimestamp(3, new Timestamp(person.getBirthdate().getTime()));
    preparedStatement.setBinaryStream(4, person.getPhoto());
    preparedStatement.executeUpdate();
    

    и, таким образом, не встроить значения в строку SQL за строкой-конкатенация.

    preparedStatement = connection.prepareStatement("INSERT INTO Person (name, email) VALUES ('" + person.getName() + "', '" + person.getEmail() + "'");
    preparedStatement.executeUpdate();
    
  • Облегчает установку нестандартных объектов Java в строке SQL, например Date, Time, Timestamp, BigDecimal, InputStream (Blob) и Reader (Clob).На большинстве этих типов вы не можете просто «сделать» toString(), как если бы вы просто Statement.Вы можете даже рефакторировать все это, используя PreparedStatement#setObject() внутри цикла, как показано в методе утилит ниже:

    public static void setValues(PreparedStatement preparedStatement, Object... values) throws SQLException {
        for (int i = 0; i < values.length; i++) {
            preparedStatement.setObject(i + 1, values[i]);
        }
    }
    

    , который можно использовать, как показано ниже:

    preparedStatement = connection.prepareStatement("INSERT INTO Person (name, email, birthdate, photo) VALUES (?, ?, ?, ?)");
    setValues(preparedStatement, person.getName(), person.getEmail(), new Timestamp(person.getBirthdate().getTime()), person.getPhoto());
    preparedStatement.executeUpdate();
    
44 голосов
/ 06 ноября 2012
  1. Они предварительно скомпилированы (один раз), что ускоряет повторное выполнение динамического SQL (при изменении параметров)

  2. Кэширование операторов базы данных повышает производительность выполнения БД

    В базах данных хранятся кэши планов выполнения для ранее выполненных операторов.Это позволяет ядру базы данных повторно использовать планы для операторов, которые были выполнены ранее.Поскольку PreparedStatement использует параметры, каждый раз, когда он выполняется, он выглядит как один и тот же SQL, база данных может повторно использовать предыдущий план доступа, уменьшая обработку.Операторы «встраивают» параметры в строку SQL и поэтому не отображаются в БД в качестве одного и того же SQL, что предотвращает использование кэша.

  3. Двоичный протокол связи означает меньшую пропускную способность и более быстрые вызовы на связьСервер БД

    Подготовленные операторы обычно выполняются через двоичный протокол, отличный от SQL.Это означает, что в пакетах меньше данных, поэтому связь с сервером происходит быстрее.Как правило, сетевые операции на порядок быстрее, чем операции с дисками, которые на порядок быстрее операций ЦП в оперативной памяти.Следовательно, любое уменьшение объема данных, передаваемых по сети, будет иметь хорошее влияние на общую производительность.

  4. Они защищают от внедрения SQL путем экранирования текста для всех предоставленных значений параметров.

  5. Они обеспечивают более сильное разделение между кодом запроса и значениями параметров (по сравнению со связанными строками SQL), повышая удобочитаемость и помогая сопровождающим кода быстро понимать входные и выходные данные запроса.

  6. В java можно вызывать getMetadata () и getParameterMetadata () для отражения полей набора результатов и полей параметров соответственно

  7. В java интеллектуально принимаетJava-объекты в качестве типов параметров через setObject, setBoolean, setByte, setDate, setDouble, setDouble, setFloat, setInt, setLong, setShort, setTime, setTimestamp - он преобразуется в формат типа JDBC, который понятен для DB (не только для формата toString ()).

  8. В Java принимает SQL-массивы в качестве параметраТип тер через метод setArray

  9. В Java принимает CLOB, BLOB, OutputStreams и Readers в качестве параметров «подачи» через методы setClob / setNClob, setBlob, setBinaryStream, setCharacterStream / setAsciiStream / setNCharacterStream соответственно,

  10. В java позволяет устанавливать специфичные для БД значения для SQL DATALINK, SQL ROWID, SQL XML и NULL с помощью методов setURL, setRowId, setSQLXML и setNull

  11. В Java наследует все методы из Statement.Он наследует метод addBatch и дополнительно позволяет добавлять набор значений параметров, чтобы соответствовать набору пакетных команд SQL с помощью метода addBatch.

  12. В java специальный тип PreparedStatement (подкласс CallableStatement) позволяет выполнять хранимые процедуры - поддерживая высокую производительность, инкапсуляцию, процедурное программирование и SQL, администрирование / обслуживание / настройку БД логики и использование собственной логики и функций БД

36 голосов
/ 17 июля 2010

PreparedStatement - очень хорошая защита (но не надежная защита) для предотвращения атак SQL-инъекций .Значения параметров привязки являются хорошим способом защиты от нежелательных посещений «маленьких таблиц Бобби» .

28 голосов
/ 19 января 2014

Некоторые из преимуществ PreparedStatement по сравнению с Statement:

  1. PreparedStatement помогает нам предотвращать атаки с использованием SQL-инъекций, поскольку он автоматически экранирует специальные символы.
  2. PreparedStatement позволяет нам выполнять динамические запросы с параметрами ввода.
  3. PreparedStatement предоставляет различные типы методов установки для установки входных параметров для запроса.
  4. PreparedStatement работает быстрее, чем Statement. Он становится более заметным, когда мы повторно используем PreparedStatement или используем его методы пакетной обработки для выполнения нескольких запросов.
  5. PreparedStatement помогает нам в написании объектно-ориентированного кода с помощью методов setter, тогда как в Statement мы должны использовать конкатенацию строк для создания запроса. Если нужно задать несколько параметров, написание Query с использованием конкатенации строк выглядит очень некрасиво и подвержено ошибкам.

Подробнее о проблеме внедрения SQL можно узнать по адресу http://www.journaldev.com/2489/jdbc-statement-vs-preparedstatement-sql-injection-example

13 голосов
/ 17 июля 2010

добавить особо нечего,

1 - если вы хотите выполнить запрос в цикле (более 1 раза), подготовленный оператор может быть быстрее из-за упомянутой вами оптимизации.

2 - параметризованный запрос - это хороший способ избежать SQL-инъекций, который доступен только в PreparedStatement.

10 голосов
/ 27 ноября 2013

Оператор является статическим, а подготовленное утверждение динамическим.

Оператор подходит для DDL и подготовленное утверждение для DML.

Оператор медленнее, а подготовленный оператор быстрее.

больше различий

7 голосов
/ 20 июля 2010

Невозможно сделать CLOB в выражении.

И: (OraclePreparedStatement) ps

5 голосов
/ 05 ноября 2012

sql-инъекция игнорируется подготовленным оператором, поэтому безопасность в увеличении подготовленного оператора

4 голосов
/ 26 ноября 2015

Как указано mattjames

Использование оператора в JDBC должно быть на 100% локализовано для использования для DDL (ALTER, CREATE, GRANT и т. Д.), Посколькуявляются единственными типами операторов, которые не могут принимать переменные BIND.PreparedStatements или CallableStatements следует использовать для КАЖДОГО ДРУГОГО типа операторов (DML, Queries).Так как это типы операторов, которые принимают переменные связывания.

Это факт, правило, закон - используйте подготовленные операторы ВЕЗДЕ.Используйте ЗАЯВЛЕНИЯ почти не где.

4 голосов
/ 28 октября 2015

Другая характеристика подготовленного или параметризованного запроса: Ссылка взята из этой статьи.

Этот оператор является одной из особенностей системы базы данных, в которой один и тот же оператор SQL выполняется многократно свысокая эффективность.Подготовленные операторы являются одним из видов шаблона и используются приложением с различными параметрами.

Шаблон отчета готовится и отправляется в систему базы данных, а система базы данных выполняет синтаксический анализ, компиляцию и оптимизацию этого шаблона исохранить без выполнения.

Некоторые из параметров, например, где предложение не передается при создании шаблона в более позднем приложении, отправляют эти параметры в систему базы данных, а система базы данных использует шаблон оператора SQL и выполняет согласно запросу.

Подготовленные операторы очень полезны для SQL-инъекций, потому что приложение может подготовить параметр, используя различные методы и протоколы.

Когда количество данных увеличивается и индексы часто меняются при этомПодготовка времени может быть неудачной, потому что в этой ситуации требуется новый план запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...