PreparedStatement setNull (..)

86

Java PreparedStatement umożliwia jawne ustawienie wartości Null. Ta możliwość to:

prepStmt.setNull(parameterIndex, Types.VARCHAR);

Czy semantyka tego wywołania jest taka sama, jak w przypadku użycia określonego setType z parametrem null?

prepStmt.setString(null);

?

pawelok
źródło

Odpowiedzi:

73

Ten przewodnik mówi:

6.1.5 Wysyłanie JDBC NULL jako parametru IN

Metoda setNull umożliwia programiście wysłanie wartości JDBC NULL (generic SQL NULL) do bazy danych w postaci parametru IN. Należy jednak pamiętać, że nadal należy określić typ JDBC parametru.

JDBC NULL zostanie również wysłany do bazy danych, gdy wartość null Java zostanie przekazana do metody setXXX (jeśli przyjmuje obiekty Java jako argumenty). Jednak metoda setObject może przyjmować wartość null tylko wtedy, gdy określono typ JDBC.

Więc tak, są równoważne.

djna
źródło
2
+1: Ciekawe. Założyłem, że tak działa setXXX z wartościami zerowymi, ale tak naprawdę nigdy go nie testowałem ani nie czytałem dokumentacji.
Powerlord
2
Nie przypuszczam, że istnieje coś takiego jak myPreparedStatement.setInteger (myIntegerObject) (chociaż widzę, że ta dokładna nazwa metody nie istnieje) w przypadku, gdy chcę użyć potencjalnie zerowej liczby całkowitej? W przeciwnym razie będę musiał użyć instrukcji if / else, wywołując .setInt () w jedną stronę i .setNull () w drugą, co wydaje się nieco uciążliwe.
@ardave, tak, to właśnie mam na myśli w ostatnim akapicie
djna
1
Wiem, że jest stary, ale ten link jest uszkodzony.
Moob
1
Nowy link: PreparedStatement
candidus
76

ale uważaj na to ....

Long nullLong = null;

preparedStatement.setLong( nullLong );

-thows pusty wskaźnik wyjątku-

ponieważ prototypem jest

setLong( long )   

NIE

setLong( Long )

miło cię złapać eh.

piekarnik
źródło
To jest właściwie przykład, który mnie tu sprowadził.
sf_jeff
13

W końcu zrobiłem mały test i podczas programowania przyszło mi do głowy, że bez metody setNull (..) nie byłoby możliwości ustawienia wartości null dla prymitywów Java. Obie strony dla obiektów

setNull(..)

i

set<ClassName>(.., null)) 

zachowywać się w ten sam sposób.

pawelok
źródło
9

Możesz również rozważyć użycie preparedStatement.setObject(index,value,type);

bithom
źródło
4
preparedStatement.setNull(index, java.sql.Types.NULL);

to powinno działać dla każdego typu. Chociaż w niektórych przypadkach awaria występuje po stronie serwera, na przykład: dla SQL:

COALESCE(?, CURRENT_TIMESTAMP)

Oracle 18XEkończy się niepowodzeniem z niewłaściwym typem: oczekiwano DATE, otrzymano STRING- to jest całkowicie poprawna awaria;

Podsumowując: jeśli dzwonisz, dobrze jest znać typ .setNull()

Dmitriy Pichugin
źródło