PreparedStatement setNull(..)


86

Java PreparedStatement提供了显式设置Null值的可能性。这种可能性是:

prepStmt.setNull(parameterIndex, Types.VARCHAR);

此调用的语义是否与使用带有null参数的特定setType时的语义相同?

prepStmt.setString(null);

Answers:


73

指南说:

6.1.5发送JDBC NULL作为IN参数

setNull方法允许程序员将JDBC NULL(通用SQL NULL)值作为IN参数发送到数据库。但是请注意,仍然必须指定参数的JDBC类型。

当将Java空值传递给setXXX方法(如果它将Java对象作为参数)时,JDBC NULL也将发送到数据库。但是,只有指定了JDBC类型时,方法setObject才能采用null值。

所以是的,它们是等效的。


2
+1:有趣。我假设这就是setXXX与null一起工作的方式,但是我从未真正测试过它或阅读过它的文档。
Powerlord

2
在我想使用可能为空的整数的情况下,我不认为有类似myPreparedStatement.setInteger(myIntegerObject)之类的东西(尽管我看到确切的方法名称不存在)?否则,我将不得不使用if / else语句,以一种方式调用.setInt()并以另一种方式调用.setNull(),这似乎有些乏味。

@ardave,是的,这就是我的最后一段意思
djna,2012年

1
我知道它很旧,但是该链接已断开。
Moob

1
新链接:PreparedStatement
candidus

76

但是请注意这一点。

Long nullLong = null;

preparedStatement.setLong( nullLong );

-抛出空指针异常-

因为原型是

setLong( long )   

setLong( Long )

好人,赶上你吧。


这实际上就是使我来到这里的例子。
sf_jeff

13

最后,我做了一个小测试,当我编写它的时候想到了,如果没有setNull(..)方法,就无法为Java原语设置null值。双向对象

setNull(..)

set<ClassName>(.., null)) 

行为相同。


9

您也可以考虑使用 preparedStatement.setObject(index,value,type);


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

应该适用于任何类型。尽管在某些情况下,失败会在服务器端发生,例如:对于SQL:

COALESCE(?, CURRENT_TIMESTAMP)

Oracle 18XE失败并输入了错误的类型:Expected DATE,got-STRING这是完全有效的失败;

底线:如果您致电,最好知道类型 .setNull()

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.