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 також буде надіслано в базу даних, коли значення null Java передається методу setXXX (якщо для аргументів воно бере об'єкти Java). Однак метод setObject може приймати нульове значення, лише якщо вказано тип JDBC.

Так так, вони еквівалентні.


2
+1: Цікаво. Я припустив, що саме так setXXX працював з нулями, але я ніколи насправді не тестував його і не читав документи для нього.
Powerlord

2
Я не думаю, що є щось на зразок myPreparedStatement.setInteger (myIntegerObject) (хоча я бачу, що точне ім'я методу не існує) у випадку, якщо я хочу використовувати потенційно нульове ціле число? В іншому випадку мені доведеться використовувати оператор if / else, викликаючи .setInt () в один бік і .setNull () в інший бік, що здається дещо нудним.

@ardave, так, це я маю на увазі під своїм останнім абзацом
djna

1
Я знаю його старе, але це посилання порушено.
Moob

1
Нове посилання: Підготовлена
заява

76

але стережіться цього ....

Long nullLong = null;

preparedStatement.setLong( nullLong );

-thows виняток нульового покажчика-

тому що прототип є

setLong( long )   

НЕ

setLong( Long )

приємно впіймати вас, а.


Це насправді той приклад, який привів мене сюди.
sf_jeff

13

Нарешті я зробив невеликий тест, і, коли я програмував його, мені прийшло в голову, що без методу setNull (..) не було б способу встановити нульові значення для примітивів Java. Для Об'єктів в обох напрямках

setNull(..)

і

set<ClassName>(.., null)) 

поводитись так само.


9

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


3
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.