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

?

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.


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

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.


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.


9

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


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.