Ricerca…


Osservazioni

A PreparedStatement dichiara l'istruzione prima che venga eseguita e consente segnaposti per i parametri. Ciò consente all'istruzione di essere preparata (e ottimizzata) una volta sul server e quindi riutilizzata con diversi set di parametri.

Il vantaggio aggiunto dei segnaposto dei parametri è la protezione contro l'iniezione SQL. Ciò viene ottenuto inviando i valori dei parametri separatamente o perché il driver esegue l'escape dei valori correttamente secondo necessità.

Impostazione dei parametri per PreparedStatement

I segnaposto nella stringa di query devono essere impostati utilizzando i metodi set* :

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

Casi speciali

Impostazione del valore NULL:

L'impostazione di un valore nullo non può essere eseguita utilizzando, ad esempio, i metodi setInt e setLong , in quanto questi utilizzano tipi primitivi ( int e long ) invece di oggetti ( Integer e Long ) e causano il NullPointerException una NullPointerException :

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

Questi casi possono essere gestiti utilizzando setNull .

setNull(int parameterIndex, int sqlType)

È stato digitato, quindi è necessario fornire il secondo parametro, vedere java.sql.Types

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

Impostazione dei LOB

I LOB richiedono oggetti speciali da utilizzare.

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

Eccezioni sui metodi set*

SQLException - se parameterIndex non corrisponde a un marker di parametro nell'istruzione SQL; se si verifica un errore di accesso al database o se questo metodo viene chiamato su un PreparedStatement chiuso

SQLFeatureNotSupportedException - se sqlType è un tipo di dati ARRAY , BLOB , CLOB , DATALINK , JAVA_OBJECT , NCHAR , NCLOB , NVARCHAR , LONGNVARCHAR , REF , ROWID , SQLXML o STRUCT e il driver JDBC non supporta questo tipo di dati

Utilizzo di base di una dichiarazione preparata

Questo esempio mostra come creare un'istruzione preparata con un'istruzione di inserimento con parametri, impostare i valori su tali parametri e quindi eseguire l'istruzione.

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

I punti interrogativi ( ? ) Nell'istruzione di inserimento sono i segnaposto dei parametri. Si tratta di parametri posizionali che vengono successivamente referenziati (utilizzando un indice a 1) utilizzando i metodi setXXX per impostare i valori su tali parametri.

L'utilizzo di try-with-resources garantisce che l'istruzione sia chiusa e che vengano rilasciate tutte le risorse in uso per tale istruzione.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow