Buscar..


Observaciones

Un PreparedStatement declara la declaración antes de que se ejecute, y permite marcadores de posición para los parámetros. Esto permite que la declaración se prepare (y optimice) una vez en el servidor y luego se reutilice con diferentes conjuntos de parámetros.

El beneficio adicional de los marcadores de posición de parámetros es que proporciona protección contra la inyección de SQL. Esto se logra ya sea enviando los valores de los parámetros por separado, o porque el conductor escapa los valores correctamente según sea necesario.

Configuración de parámetros para PreparedStatement

Los marcadores de posición en la cadena de consulta deben establecerse utilizando los métodos 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

Casos especiales

Configuración de valor nulo:

La configuración de un valor nulo no se puede realizar utilizando, por ejemplo, los métodos setInt y setLong , ya que estos usan tipos primitivos ( int y long ) en lugar de objetos ( Integer y Long ), y causan que se NullPointerException una NullPointerException :

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

Estos casos pueden ser manejados usando setNull .

setNull(int parameterIndex, int sqlType)

Está escrito, por lo que se debe proporcionar el segundo parámetro, consulte java.sql.Types

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

Configuración de LOBs

Los LOB requieren objetos especiales para ser utilizados.

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);

Excepciones en los métodos de set*

SQLException - si el valor de parameterIndex no corresponde a un marcador de parámetro en la declaración SQL; si se produce un error de acceso a la base de datos o se llama a este método en una PreparedStatement cerrada

SQLFeatureNotSupportedException - si sqlType es un tipo de datos ARRAY , BLOB , CLOB , DATALINK , JAVA_OBJECT , NCHAR , NCLOB , NVARCHAR , LONGNVARCHAR , REF , ROWID , SQLXML o STRUCT y el controlador JDBC no admite este tipo de datos

Uso básico de una declaración preparada

Este ejemplo muestra cómo crear una declaración preparada con una instrucción de inserción con parámetros, establecer valores a esos parámetros y luego ejecutar la instrucción.

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();
}

Los signos de interrogación ( ? ) En la declaración de inserción son los marcadores de posición de parámetros. Son parámetros posicionales a los que luego se hace referencia (usando un índice basado en 1) que usan los métodos setXXX para establecer valores para esos parámetros.

El uso de try-with-resources garantiza que la declaración se cierre y se liberen los recursos en uso para esa declaración.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow