jdbc
Przygotowane oświadczenie
Szukaj…
Uwagi
PreparedStatement
deklaruje instrukcję przed jej wykonaniem i pozwala na symbole zastępcze dla parametrów. Pozwala to na przygotowanie (i zoptymalizowanie) instrukcji na serwerze, a następnie ich ponowne użycie z różnymi zestawami parametrów.
Dodatkową zaletą symboli zastępczych parametrów jest to, że zapewnia ochronę przed wstrzyknięciem SQL. Osiąga się to albo przez przesłanie wartości parametrów osobno, albo dlatego, że sterownik odpowiednio zmienia wartości w razie potrzeby.
Ustawianie parametrów PreparedStatement
Symbole zastępcze w ciągu zapytania należy ustawić za pomocą metod 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
Przypadki specjalne
Ustawienie wartości NULL:
Ustawienie wartości null nie może być osiągnięte przy użyciu na przykład metod setInt
i setLong
, ponieważ używają one typów pierwotnych ( int
i long
) zamiast obiektów ( Integer
i Long
) i spowodowałyby NullPointerException
:
void setFloat(int parameterIndex, float x)
void setInt(int parameterIndex, int x)
void setLong(int parameterIndex, long x)
Te przypadki można obsługiwać za pomocą setNull
.
setNull(int parameterIndex, int sqlType)
Jest wpisany, więc należy podać drugi parametr, patrz java.sql.Types
//setting a NULL for an integer value
statement.setNull(2, java.sql.Types.INTEGER);
Ustawianie LOB
LOB wymagają użycia specjalnych obiektów.
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);
Wyjątki od metod set*
SQLException
- jeśliparameterIndex
nie odpowiada znacznikowi parametru w instrukcji SQL; jeśli wystąpi błąd dostępu do bazy danych lub ta metoda zostanie wywołana na zamkniętymPreparedStatement
SQLFeatureNotSupportedException
- jeśli sqlType jest typemARRAY
,BLOB
,CLOB
,DATALINK
,JAVA_OBJECT
,NCHAR
,NCLOB
,NVARCHAR
,LONGNVARCHAR
,REF
,ROWID
,SQLXML
lubSTRUCT
a sterownikSTRUCT
nie obsługuje tego typu danych
Podstawowe użycie przygotowanego wyciągu
W tym przykładzie pokazano, jak utworzyć przygotowaną instrukcję z instrukcją insert z parametrami, ustawić wartości na te parametry, a następnie wykonać instrukcję.
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();
}
Znaki zapytania ( ?
) W instrukcji insert są symbolami zastępczymi parametrów. Są to parametry pozycyjne, do których później się odwołuje (przy użyciu indeksu 1) za pomocą metod setXXX
celu ustawienia wartości na te parametry.
Zastosowanie try-with-resources zapewnia zamknięcie instrukcji i zwolnienie wszelkich zasobów używanych dla tej instrukcji.