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
- separameterIndex
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 unPreparedStatement
chiuso
SQLFeatureNotSupportedException
- se sqlType è un tipo di datiARRAY
,BLOB
,CLOB
,DATALINK
,JAVA_OBJECT
,NCHAR
,NCLOB
,NVARCHAR
,LONGNVARCHAR
,REF
,ROWID
,SQLXML
oSTRUCT
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.