PreparedStatement setNull (..)


88

Java PreparedStatement memberikan kemungkinan untuk menetapkan nilai Null secara eksplisit. Kemungkinan ini adalah:

prepStmt.setNull(parameterIndex, Types.VARCHAR);

Apakah semantik panggilan ini sama dengan saat menggunakan setType tertentu dengan parameter null?

prepStmt.setString(null);

?

Jawaban:


76

Panduan ini mengatakan:

6.1.5 Mengirim JDBC NULL sebagai parameter IN

Metode setNull memungkinkan pemrogram untuk mengirim nilai JDBC NULL (SQL NULL generik) ke database sebagai parameter IN. Namun, perhatikan bahwa seseorang masih harus menentukan jenis parameter JDBC.

JDBC NULL juga akan dikirim ke database saat nilai null Java diteruskan ke metode setXXX (jika menggunakan objek Java sebagai argumen). Metode setObject, bagaimanapun, dapat mengambil nilai null hanya jika tipe JDBC ditentukan.

Jadi ya mereka setara.


2
+1: Menarik. Saya berasumsi begitulah cara setXXX bekerja dengan nulls, tetapi saya tidak pernah benar-benar mengujinya atau membaca dokumennya.
Powerlord

2
Saya kira tidak ada sesuatu seperti myPreparedStatement.setInteger (myIntegerObject) (meskipun saya melihat bahwa nama metode yang tepat tidak ada) dalam kasus saya ingin menggunakan integer yang berpotensi null? Jika tidak, saya harus menggunakan pernyataan if / else, memanggil .setInt () dengan satu cara dan .setNull () dengan cara lain, yang tampaknya agak membosankan.

@ardave, ya itulah yang saya maksud dengan paragraf terakhir saya
djna

1
Saya tahu ini sudah tua tetapi tautan itu rusak.
Moob

1
Tautan baru: PreparedStatement
candidus

77

tapi hati-hati untuk ini ....

Long nullLong = null;

preparedStatement.setLong( nullLong );

-maka pengecualian pointer nol-

karena protipe itu

setLong( long )   

TIDAK

setLong( Long )

bagus untuk menangkapmu eh.


Itu sebenarnya contoh yang membawa saya ke sini.
sf_jeff

13

Akhirnya saya melakukan tes kecil dan ketika saya memprogramnya, terlintas di benak saya, bahwa tanpa metode setNull (..) tidak akan ada cara untuk menetapkan nilai null untuk primitif Java. Untuk Objek dua arah

setNull(..)

dan

set<ClassName>(.., null)) 

berperilaku sama.


10

Anda juga bisa mempertimbangkan untuk menggunakan preparedStatement.setObject(index,value,type);


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

yang seharusnya bekerja untuk semua jenis. Meskipun dalam beberapa kasus kegagalan terjadi di sisi server, seperti: untuk SQL:

COALESCE(?, CURRENT_TIMESTAMP)

Oracle 18XEgagal dengan tipe yang salah: diharapkan DATE, didapat STRING- itu adalah kegagalan yang benar-benar valid;

Intinya: mengetahui jenisnya adalah baik jika Anda menelepon .setNull()

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.