Поиск…


замечания

PreparedStatement объявляет оператор перед его исполнением и позволяет заполнителям параметров. Это позволяет оператору готовить (и оптимизировать) один раз на сервере, а затем повторно использовать с различными наборами параметров.

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

Настройка параметров для PreparedStatement

Заполнители в строке запроса должны быть установлены с помощью методов set* :

String sql = "SELECT * FROM EMP WHERE JOB = ? AND SAL > ?";

//Create statement to make your operations
PreparedStatement statement = connection.prepareStatement(sql);

statement.setString(1, "MANAGER"); // String value
statement.setInt(2, 2850);         // int value

Особые случаи

Установка значения NULL:

Установка нулевого значения не может быть выполнена с использованием, например, методов setInt и setLong , поскольку они используют примитивные типы ( int и long ) вместо объектов ( Integer и Long ) и будут вызывать NullPointerException :

void setFloat(int parameterIndex, float x) 
void setInt(int parameterIndex, int x) 
void setLong(int parameterIndex, long x)  

Эти случаи могут быть обработаны с помощью setNull .

setNull(int parameterIndex, int sqlType)

Он напечатан, поэтому необходимо указать второй параметр, см. Java.sql.Types

//setting a NULL for an integer value
statement.setNull(2, java.sql.Types.INTEGER);

Установка LOB

LOB требуют использования специальных объектов.

Clob longContent = connection.createClob();
Writer longContentWriter = longContent.setCharacterStream(1); // position: beginning
longContentWriter.write("This will be the content of the CLOB");

pstmt = connection.prepareStatement("INSERT INTO CLOB_TABLE(CLOB_VALUE) VALUES (?)");
pstmt.setClob(1, longContent);

Исключения из set* методов

SQLException - если parameterIndex не соответствует маркеру параметра в выражении SQL; если возникает ошибка доступа к базе данных или этот метод вызывается на закрытом PreparedStatement

SQLFeatureNotSupportedException - если sqlType - это тип данных ARRAY , BLOB , CLOB , DATALINK , JAVA_OBJECT , NCHAR , NCLOB , NVARCHAR , LONGNVARCHAR , REF , ROWID , SQLXML или STRUCT а драйвер JDBC не поддерживает этот тип данных

Основное использование подготовленного заявления

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

Connection connection = ... // connection created earlier
try (PreparedStatement insert = connection.prepareStatement(
        "insert into orders(id, customerid, totalvalue, comment) values (?, ?, ?, ?)")) {
    //NOTE: Position indexes start at 1, not 0
    insert.setInt(1, 1);
    insert.setInt(2, 7934747);
    insert.setBigDecimal(3, new BigDecimal("100.95"));
    insert.setString(4, "quick delivery requested");

    insert.executeUpdate();
}

Вопросительные знаки ( ? ) В инструкции insert - это заполнители параметров. Это позиционные параметры, которые позже ссылаются (используя индекс на основе 1), используя методы setXXX для установки значений этих параметров.

Использование try-in-resources гарантирует, что оператор закрыт, и все ресурсы, используемые для этого оператора, будут выпущены.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow