Suche…


Bemerkungen

Ein PreparedStatement deklariert die Anweisung vor ihrer Ausführung und erlaubt Platzhalter für Parameter. Dadurch kann die Anweisung einmal auf dem Server vorbereitet (und optimiert) und dann mit verschiedenen Parametersätzen wiederverwendet werden.

Der zusätzliche Vorteil der Parameterplatzhalter besteht darin, dass sie Schutz vor der SQL-Injection bietet. Dies wird entweder durch das separate Senden der Parameterwerte oder durch die korrekte Eingabe der Werte durch den Treiber erreicht.

Parameter für PreparedStatement einstellen

Platzhalter in der Abfragezeichenfolge müssen mithilfe der set* -Methoden festgelegt werden:

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

Sonderfälle

NULL-Wert einstellen:

Das Festlegen eines Nullwerts kann nicht beispielsweise mit den Methoden setInt und setLong werden, da diese primitive Typen ( int und long ) anstelle von Objekten ( Integer und Long ) verwenden und eine NullPointerException ausgelöst wird:

void setFloat(int parameterIndex, float x) 
void setInt(int parameterIndex, int x) 
void setLong(int parameterIndex, long x)  

Diese Fälle können mit setNull .

setNull(int parameterIndex, int sqlType)

Es wird eingegeben, daher muss der zweite Parameter angegeben werden, siehe java.sql.Types

//setting a NULL for an integer value
statement.setNull(2, java.sql.Types.INTEGER);

LOBs einstellen

Für LOBs müssen spezielle Objekte verwendet werden.

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);

Ausnahmen bei set* -Methoden

SQLException - wenn parameterIndex keiner Parametermarkierung in der SQL-Anweisung entspricht; Wenn ein Datenbankzugriffsfehler auftritt oder diese Methode bei einem geschlossenen PreparedStatement aufgerufen wird

SQLFeatureNotSupportedException - Wenn sqlType ein Datentyp vom Typ ARRAY , BLOB , CLOB , DATALINK , JAVA_OBJECT , NCHAR , NCLOB , NVARCHAR , LONGNVARCHAR , REF , ROWID , SQLXML oder STRUCT und dieser Datentyp nicht unterstützt wird

Grundlegende Verwendung einer vorbereiteten Anweisung

Dieses Beispiel zeigt, wie Sie eine vorbereitete Anweisung mit einer Einfügeanweisung mit Parametern erstellen, diesen Parametern Werte zuweisen und dann die Anweisung ausführen.

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();
}

Die Fragezeichen ( ? ) In der Einfügeanweisung sind die Parameterplatzhalter. Sie sind Positionsparameter, auf die später (mithilfe eines Indexes auf 1-Basis) setXXX , wobei die setXXX Methoden verwendet werden, um Werte für diese Parameter setXXX .

Die Verwendung von try-with-resources stellt sicher, dass die Anweisung geschlossen wird und alle für diese Anweisung verwendeten Ressourcen freigegeben werden.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow