jdbc
Discorso preparato
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- separameterIndexnon 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 unPreparedStatementchiuso
SQLFeatureNotSupportedException- se sqlType è un tipo di datiARRAY,BLOB,CLOB,DATALINK,JAVA_OBJECT,NCHAR,NCLOB,NVARCHAR,LONGNVARCHAR,REF,ROWID,SQLXMLoSTRUCTe 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.