jdbc
PreparedStatement
Zoeken…
Opmerkingen
Een PreparedStatement
declareert de instructie voordat deze wordt uitgevoerd en biedt plaatshouders voor parameters. Hierdoor kan de instructie eenmaal op de server worden voorbereid (en geoptimaliseerd) en vervolgens opnieuw worden gebruikt met verschillende sets parameters.
Het extra voordeel van de parameter placeholders is dat deze bescherming biedt tegen SQL-injectie. Dit wordt bereikt door de parameterwaarden afzonderlijk te verzenden of omdat het stuurprogramma waar nodig correct ontsnapt.
Parameters instellen voor PreparedStatement
Plaatshouders in de queryreeks moeten worden ingesteld met behulp van de set*
-methoden:
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
Speciale gevallen
NULL-waarde instellen:
Het instellen van een null-waarde kan niet worden bereikt met bijvoorbeeld de methoden setInt
en setLong
, omdat deze primitieve typen ( int
en long
) gebruiken in plaats van objecten ( Integer
en Long
), waardoor een NullPointerException
wordt gegenereerd:
void setFloat(int parameterIndex, float x)
void setInt(int parameterIndex, int x)
void setLong(int parameterIndex, long x)
Deze gevallen kunnen worden behandeld met setNull
.
setNull(int parameterIndex, int sqlType)
Het is getypt, dus de tweede parameter moet worden opgegeven, zie java.sql.Types
//setting a NULL for an integer value
statement.setNull(2, java.sql.Types.INTEGER);
LOB's instellen
LOB's vereisen dat speciale objecten worden gebruikt.
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);
Uitzonderingen op set*
-methoden
SQLException
- alsparameterIndex
niet overeenkomt met een parametermarkering in de SQL-instructie; als een database toegangsfout optreedt of deze methode wordt aangeroepen in een geslotenPreparedStatement
SQLFeatureNotSupportedException
- als sqlType eenARRAY
,BLOB
,CLOB
,DATALINK
,JAVA_OBJECT
,NCHAR
,NCLOB
,NVARCHAR
,LONGNVARCHAR
,REF
,ROWID
, het gegevenstypeSQLXML
ofSTRUCT
is en de JDBC-driver dit gegevenstype niet ondersteunt
Basisgebruik van een voorbereide verklaring
Dit voorbeeld laat zien hoe u een voorbereide instructie maakt met een invoeginstructie met parameters, waarden instelt op die parameters en vervolgens de instructie uitvoert.
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();
}
De vraagtekens ( ?
) In de invoeginstructie zijn de parameterplaatshouders. Het zijn positionele parameters waarnaar later wordt verwezen (met behulp van een op 1 gebaseerde index) met behulp van de setXXX
methoden om waarden in te stellen op die parameters.
Het gebruik van try-with-resources zorgt ervoor dat de instructie wordt gesloten en alle bronnen die voor die instructie worden gebruikt, worden vrijgegeven.