PreparedStatement setNull(..)

paw*_*que 77 java jdbc prepared-statement

Java PreparedStatement提供了明确设置Null值的可能性.这种可能性是:

prepStmt.setNull(parameterIndex, Types.VARCHAR);
Run Code Online (Sandbox Code Playgroud)

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

prepStmt.setString(null);
Run Code Online (Sandbox Code Playgroud)

小智 71

但要小心......

Long nullLong = null;

preparedStatement.setLong( nullLong );
Run Code Online (Sandbox Code Playgroud)

-thows null指针异常 -

因为原型是

setLong( long )   
Run Code Online (Sandbox Code Playgroud)

setLong( Long )
Run Code Online (Sandbox Code Playgroud)

很高兴能赶上你的呃.

  • 在这种情况下(在我的例子中使用 Postgres DB),您可以使用 setObject 方法。`Long nullLong = null; preparedStatement.setObject(nullLong);` (2认同)

djn*_*jna 67

指南说:

6.1.5将JDBC NULL作为IN参数发送

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

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

所以是的,他们是等同的.

  • +1:有趣.我假设setXXX是如何使用null的,但我从未真正测试过它或为它读过文档. (2认同)
  • 我不认为有一些像myPreparedStatement.setInteger(myIntegerObject)(虽然我看到确切的方法名称不存在),在我想要使用可能的空整数的情况下?否则我将不得不使用if/else语句,以一种方式调用.setInt()和另一种方式调用.setNull(),这看起来有点单调乏味. (2认同)

paw*_*que 13

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

setNull(..)
Run Code Online (Sandbox Code Playgroud)

set<ClassName>(.., null)) 
Run Code Online (Sandbox Code Playgroud)

表现方式相同.


小智 10

preparedStatement.setNull(index, java.sql.Types.NULL);
Run Code Online (Sandbox Code Playgroud)

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

COALESCE(?, CURRENT_TIMESTAMP)
Run Code Online (Sandbox Code Playgroud)

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

底线:如果你打电话知道类型是很好的 .setNull()


小智 6

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