【问题标题】:How to escape from use PreparedStatement.setNull?如何摆脱使用 PreparedStatement.setNull?
【发布时间】:2016-11-17 20:13:24
【问题描述】:

我的数据库中有一个很大的表。其中一些字段可能为空。

我只是想逃避使用:

PreparedStatement.setNull(index, Type.X)

喜欢:

if(obj.getSomaData() == null){
  insertStmt.setNull(++i, java.sql.Types.VARCHAR);
}else{
  insertStmt.setString(++i, obj.getSomaData());
}

有更好更清洁的方法吗?

P.S.:我使用的是 PostgreSQL。

【问题讨论】:

  • 你的意思是不想使用setNull()方法?如果您是INSERTing 数据,则无需显式设置值NULL,因为默认情况下缺少的值将是NULL
  • 我认为 Postgres JDBC 驱动程序可以很好地处理 setString(index, null)
  • @MickMnemonic 仅当这些列未包含在插入语句中时才是正确的,如果包含它们,则 JDBC 驱动程序应为未明确设置的值提供异常。请参阅 JDBC 4.2 第 13.2.2 节:“如果未为参数提供值,则用于执行 PreparedStatement 对象(executeQueryexecuteUpdateexecute)的方法将抛出 SQLException标记。”
  • @Mark,是的,在INSERT 语句中不使用setNull() 将意味着您需要动态添加正确数量的绑定占位符并动态生成列列表。并且做这一切可能不值得,尤其是当您使用相同的语句插入多行时。因此,正如您的回答所暗示的,不需要特定的 null 处理。

标签: java postgresql jdbc


【解决方案1】:

setNull 的主要用例是将原始类型设置为 null,并处理一些驱动程序无法知道参数的数据类型并需要明确指示的边缘情况。

在大多数情况下,您应该可以使用setString(idx, null)(或其他对象类型的setXXX)就好了。

引用 JDBC 4.2 第 13.2.2.4 节:

如果将 Java null 传递给任何采用 Java 对象的 setter 方法,则该参数将设置为 JDBC NULL

“无类型”null 例外(例如使用setObject),建议您使用setNullsetObject数据库支持没有类型信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-28
    • 2013-10-31
    • 2020-10-19
    • 2019-12-01
    • 2013-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多