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 - om parameterIndex inte motsvarar en parametermarkör i SQL-uttalandet; om ett databasåtkomstfel inträffar eller den här metoden kallas på en stängd PreparedStatement

SQLFeatureNotSupportedException - om sqlType är en ARRAY , BLOB , CLOB , DATALINK , JAVA_OBJECT , NCHAR , NCLOB , NVARCHAR , LONGNVARCHAR , REF , ROWID , SQLXML eller STRUCT 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.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow