97

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

prepStmt.setNull(parameterIndex, Types.VARCHAR);

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

prepStmt.setString(null);

?

4

5 回答 5

82

但请注意这一点....

Long nullLong = null;

preparedStatement.setLong( nullLong );

- 抛出空指针异常 -

因为原型是

setLong( long )   

不是

setLong( Long )

很高兴能抓住你,嗯。

于 2012-03-03T02:31:54.833 回答
79

指南说:

6.1.5 将 JDBC NULL 作为 IN 参数发送

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

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

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

于 2009-08-31T13:23:20.420 回答
14

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

setNull(..)

set<ClassName>(.., null)) 

行为方式相同。

于 2009-09-01T11:10:01.580 回答
10

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

于 2015-11-24T03:59:31.147 回答
10
preparedStatement.setNull(index, java.sql.Types.NULL);

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

COALESCE(?, CURRENT_TIMESTAMP)

Oracle 18XE以错误的类型失败:预期DATE,得到STRING——这是一个完全有效的失败;

底线:如果你打电话,最好知道类型.setNull()

更新:stackoverflow 需要雇用更多的编辑来在我的帖子中添加\删除标点符号

于 2020-02-12T23:48:03.887 回答