jdbc
Förberett uttalande
Sök…
Anmärkningar
En PreparedStatement
deklarerar uttalandet innan det körs och tillåter platshållare för parametrar. Detta gör att uttalandet kan förberedas (och optimeras) en gång på servern och sedan återanvändas med olika uppsättningar parametrar.
Den extra fördelen med parameterhållare är att den ger skydd mot SQL-injektion. Detta uppnås antingen genom att skicka parametervärden separat, eller genom att drivrutinen undviker värden korrekt vid behov.
Ställa in parametrar för PreparedStatement
Platshållare i frågesträngen måste ställas in med hjälp av set*
-metoderna:
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
Speciella fall
Ställer in NULL-värde:
Att ställa in ett nollvärde kan inte åstadkommas med hjälp av exempelvis setInt
och setLong
metoderna, eftersom dessa använder primitiva typer ( int
och long
) istället för objekt ( Integer
och Long
), och skulle göra att en NullPointerException
kastas:
void setFloat(int parameterIndex, float x)
void setInt(int parameterIndex, int x)
void setLong(int parameterIndex, long x)
Dessa fall kan hanteras med setNull
.
setNull(int parameterIndex, int sqlType)
Det är skrivet, så den andra parametern måste anges, se java.sql.Types
//setting a NULL for an integer value
statement.setNull(2, java.sql.Types.INTEGER);
Ställa in LOB
LOB: er kräver att specialobjekt används.
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);
Undantag från set*
-metoder
SQLException
- omparameterIndex
inte motsvarar en parametermarkör i SQL-uttalandet; om ett databasåtkomstfel inträffar eller den här metoden kallas på en stängdPreparedStatement
SQLFeatureNotSupportedException
- om sqlType är enARRAY
,BLOB
,CLOB
,DATALINK
,JAVA_OBJECT
,NCHAR
,NCLOB
,NVARCHAR
,LONGNVARCHAR
,REF
,ROWID
,SQLXML
ellerSTRUCT
datatyp och JDBC-drivrutinen stöder inte denna datatyp
Grundläggande användning av ett förberett uttalande
Det här exemplet visar hur du skapar ett förberett uttalande med ett infogningsmeddelande med parametrar, ställer in värden på dessa parametrar och kör sedan uttalandet.
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();
}
Frågetecknen ( ?
) I inläggsförklaringen är parameterns platshållare. Det är positionsparametrar som senare hänvisas till (med ett 1-baserat index) med setXXX
metoderna för att ställa in värden på dessa parametrar.
Användningen av försök med resurser säkerställer att uttalandet är stängt och alla resurser som används för det uttalandet släpps.