PreparedStatement setNull (..)


86

Java PreparedStatement предоставляет возможность явно установить значение Null. Эта возможность:

prepStmt.setNull(parameterIndex, Types.VARCHAR);

Семантика этого вызова такая же, как при использовании определенного setType с нулевым параметром?

prepStmt.setString(null);

?

Ответы:


73

В этом руководстве говорится:

6.1.5 Отправка JDBC NULL в качестве параметра IN

Метод setNull позволяет программисту отправлять в базу данных значение JDBC NULL (общий SQL NULL) в качестве параметра IN. Обратите внимание, однако, что по-прежнему необходимо указывать тип JDBC параметра.

JDBC NULL также будет отправлен в базу данных, когда нулевое значение Java передается методу setXXX (если он принимает объекты Java в качестве аргументов). Однако метод setObject может принимать нулевое значение только в том случае, если указан тип JDBC.

Так что да, они эквивалентны.


2
+1: Интересно. Я предположил, что setXXX работает с нулями, но я никогда не тестировал его и не читал документацию по нему.
Powerlord

2
Я не думаю, что есть что-то вроде myPreparedStatement.setInteger (myIntegerObject) (хотя я вижу, что точное имя метода не существует) в случае, если я хочу использовать потенциально нулевое целое число? В противном случае мне придется использовать оператор if / else, вызывая .setInt () в одну сторону и .setNull () в другую, что кажется немного утомительным.

@ardave, да, это то, что я подразумеваю под своим последним абзацем
djna

1
Я знаю, что он старый, но эта ссылка не работает.
Moob

1
Новая ссылка: PreparedStatement
сапсИйиз

76

но остерегайтесь этого ....

Long nullLong = null;

preparedStatement.setLong( nullLong );

-выводит исключение нулевого указателя-

потому что прототип

setLong( long )   

НЕ

setLong( Long )

приятно поймать тебя да.


Это фактически тот пример, который привел меня сюда.
sf_jeff

13

Наконец, я провел небольшой тест, и пока я программировал, мне пришло в голову, что без метода setNull (..) не было бы возможности установить нулевые значения для примитивов Java. Для объектов в обоих направлениях

setNull(..)

а также

set<ClassName>(.., null)) 

веди себя так же.


9

Вы также можете рассмотреть возможность использования preparedStatement.setObject(index,value,type);


4
preparedStatement.setNull(index, java.sql.Types.NULL);

это должно работать для любого типа. Хотя в некоторых случаях сбой происходит на стороне сервера, например: для SQL:

COALESCE(?, CURRENT_TIMESTAMP)

Oracle 18XEсбой неправильного типа: ожидаемый DATE, полученный STRING- это вполне допустимый сбой;

Итог: хорошо знать тип, если вы звоните .setNull()

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.