PreparedStatement setNull (..)


86

Java PreparedStatement cung cấp khả năng đặt giá trị Null một cách rõ ràng. Khả năng này là:

prepStmt.setNull(parameterIndex, Types.VARCHAR);

Ngữ nghĩa của lệnh gọi này có giống như khi sử dụng setType cụ thể với tham số null không?

prepStmt.setString(null);

?

Câu trả lời:


73

Hướng dẫn này nói:

6.1.5 Gửi JDBC NULL dưới dạng tham số IN

Phương thức setNull cho phép lập trình viên gửi giá trị JDBC NULL (một SQL NULL) cho cơ sở dữ liệu dưới dạng tham số IN. Tuy nhiên, lưu ý rằng người ta vẫn phải chỉ định kiểu JDBC của tham số.

Một JDBC NULL cũng sẽ được gửi đến cơ sở dữ liệu khi một giá trị Java null được chuyển cho một phương thức setXXX (nếu nó nhận các đối tượng Java làm đối số). Tuy nhiên, phương thức setObject chỉ có thể nhận giá trị null nếu kiểu JDBC được chỉ định.

Vì vậy, có chúng tương đương nhau.


2
+1: Thật thú vị. Tôi cho rằng đó là cách setXXX hoạt động với null, nhưng tôi chưa bao giờ thực sự kiểm tra nó hoặc đọc tài liệu về nó.
Powerlord

2
Tôi không cho rằng có một cái gì đó giống như myPreparedStatement.setInteger (myIntegerObject) (mặc dù tôi thấy rằng tên phương thức chính xác không tồn tại) trong trường hợp tôi muốn sử dụng một số nguyên có khả năng rỗng? Nếu không, tôi sẽ phải sử dụng câu lệnh if / else, gọi .setInt () theo một cách và .setNull () theo cách khác, điều này có vẻ hơi tẻ nhạt.

@ardave, vâng, đó là ý của tôi trong đoạn cuối cùng của tôi
djna

1
Tôi biết nó cũ nhưng liên kết đó đã bị hỏng.
Moob

1
Liên kết mới: PreparedStatement
candidus

76

nhưng hãy coi chừng điều này ....

Long nullLong = null;

preparedStatement.setLong( nullLong );

-thows null pointer exception-

bởi vì kiểu mẫu là

setLong( long )   

KHÔNG PHẢI

setLong( Long )

rất vui được đón bạn đi chơi.


Đó thực sự là ví dụ đưa tôi đến đây.
sf_jeff

13

Cuối cùng, tôi đã làm một bài kiểm tra nhỏ và trong khi lập trình, tôi nghĩ rằng nếu không có phương thức setNull (..) thì sẽ không có cách nào để đặt giá trị null cho các nguyên thủy Java. Đối với các đối tượng theo cả hai cách

setNull(..)

set<ClassName>(.., null)) 

hành xử theo cùng một cách.


9

Bạn cũng có thể cân nhắc sử dụng preparedStatement.setObject(index,value,type);


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

mà sẽ hoạt động cho bất kỳ loại nào. Mặc dù trong một số trường hợp, lỗi xảy ra ở phía máy chủ, như: đối với SQL:

COALESCE(?, CURRENT_TIMESTAMP)

Oracle 18XEthất bại với loại sai: dự kiến DATE, đã nhận STRING- đó là một thất bại hoàn toàn hợp lệ;

Điểm mấu chốt: bạn nên biết loại nếu gọi .setNull()

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.