jdbc
Подготовленное заявление
Поиск…
замечания
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 гарантирует, что оператор закрыт, и все ресурсы, используемые для этого оператора, будут выпущены.