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 - als parameterIndex niet overeenkomt met een parametermarkering in de SQL-instructie; als een database toegangsfout optreedt of deze methode wordt aangeroepen in een gesloten PreparedStatement

SQLFeatureNotSupportedException - als sqlType een ARRAY , BLOB , CLOB , DATALINK , JAVA_OBJECT , NCHAR , NCLOB , NVARCHAR , LONGNVARCHAR , REF , ROWID , het gegevenstype SQLXML of STRUCT 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.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow