Recherche…


Remarques

Un PreparedStatement déclare la déclaration avant son exécution et autorise les espaces réservés pour les paramètres. Cela permet à l'instruction d'être préparée (et optimisée) une fois sur le serveur, puis réutilisée avec différents ensembles de paramètres.

L'avantage supplémentaire des espaces réservés aux paramètres est qu'il fournit une protection contre l'injection SQL. Cela se fait soit en envoyant les valeurs de paramètre séparément, soit parce que le pilote échappe correctement aux valeurs requises.

Définition des paramètres pour PreparedStatement

Les espaces réservés dans la chaîne de requête doivent être définis à l'aide des méthodes 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

Cas spéciaux

Définition de la valeur NULL:

La définition d'une valeur nulle ne peut pas être réalisée en utilisant, par exemple, les méthodes setInt et setLong , car elles utilisent des types primitifs ( int et long ) au lieu d'objets ( Integer et Long ) et provoqueraient une NullPointerException :

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

Ces cas peuvent être traités en utilisant setNull .

setNull(int parameterIndex, int sqlType)

Il est tapé, donc le deuxième paramètre doit être fourni, voir java.sql.Types

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

Définition de LOB

Les objets LOB nécessitent des objets spéciaux à utiliser.

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

Exceptions sur les méthodes set*

SQLException - si parameterIndex ne correspond pas à un marqueur de paramètre dans l'instruction SQL; si une erreur d'accès à la base de données se produit ou si cette méthode est appelée sur un état PreparedStatement fermé

SQLFeatureNotSupportedException - si sqlType est un type de données ARRAY , BLOB , CLOB , DATALINK , JAVA_OBJECT , NCHAR , NCLOB , NVARCHAR , LONGNVARCHAR , REF , ROWID , SQLXML ou STRUCT et que le pilote JDBC ne prend pas en charge ce type de données

Utilisation de base d'une déclaration préparée

Cet exemple montre comment créer une instruction préparée avec une instruction insert avec des paramètres, définir des valeurs pour ces paramètres, puis exécuter l'instruction.

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

Les points d'interrogation ( ? ) Dans l'instruction insert sont les espaces réservés pour les paramètres. Ce sont des paramètres de position qui sont référencés ultérieurement (à l'aide d'un index basé sur 1) en utilisant les méthodes setXXX pour définir des valeurs pour ces paramètres.

L'utilisation de try-with-resources garantit que l'instruction est fermée et que toutes les ressources utilisées pour cette instruction sont libérées.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow