jdbc
Affirmation préparée
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
- siparameterIndex
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 étatPreparedStatement
fermé
SQLFeatureNotSupportedException
- si sqlType est un type de donnéesARRAY
,BLOB
,CLOB
,DATALINK
,JAVA_OBJECT
,NCHAR
,NCLOB
,NVARCHAR
,LONGNVARCHAR
,REF
,ROWID
,SQLXML
ouSTRUCT
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.