JDBC PreparedStatement 中“null primitives”的解决方法?

2022-09-03 08:53:07

使用原始 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);

...

在这里,如果是,那很好 - 字符串是可为空的。但是如果返回,我们就有问题了。someStringnullgetSomeInteger()null

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

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

那么解决方法是什么呢?


答案 1

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


答案 2

您可以使用该类的 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);

示例取自此处


推荐