JDBC PreparedStatement中"null原语"的解决方法?

IAm*_*aja 8 java sql nullable jdbc prepared-statement

使用原始JDBC时,您可以参数化PreparedStatement如下:

PreparedStatement statement = connection.prepareStatement(someSQLString);
String someString = getSomeString();
Integer int = getSomeInteger();
statement.setString(1, someString);
statement.setLong(2, 5L);
statement.setInt(3, int);

...
Run Code Online (Sandbox Code Playgroud)

在这里,如果someString是null,那很好 - 字符串可以为空.但如果getSomeInteger()回归null,我们就有问题了.

PreparedStatement#setInt(int,int)将基元设置int为值,因此不能null.

但是,我可能希望上面第3列的值null适用于此特定记录,这是完全合理的.毕竟,我曾经使用的每个RDBMS都允许数字(INT,LONG等)字段为NULLABLE ...

那么解决方法是什么?

Lui*_*oza 18

不要使用其中任何一个setObject而是使用,让JDBC驱动程序来管理null值而不是你.

  • @IAmYourFaja 这将取决于 JDBC 驱动程序。请注意`setObject` 文档的最后一部分: ***注意:** 并非所有数据库都允许将非类型化 Null 发送到后端。为了获得最大的可移植性,应该使用 setNull 或 setObject(int parameterIndex, Object x, int sqlType) 方法而不是 setObject(int parameterIndex, Object x)*。我建议做一些测试,然后针对您的情况使用最好的方法。 (2认同)

Kon*_*kov 9

您可以使用该类的setNull(int parameterIndex,int sqlType)方法PreparedStatement.

以下是如何使用它的示例:

  String query = 
     "insert into nullable_table(id,string_column, int_column) values(?, ?, ?)";

  // create PrepareStatement object
  PreparedStatement pstmt = connection.prepareStatement(query);
  pstmt.setString(1, id);
  pstmt.setNull(2, java.sql.Types.VARCHAR);
  pstmt.setNull(3, java.sql.Types.INTEGER);
Run Code Online (Sandbox Code Playgroud)

从这里取的例子.