将 null 设置为 PreparedStatement

Posted

技术标签:

【中文标题】将 null 设置为 PreparedStatement【英文标题】:Setting null to PreparedStatement 【发布时间】:2012-06-01 14:49:14 【问题描述】:

典型情况:我们有一些类型为Integer 的可空列,它可能是null 或一些int 值。所以我们使用以下内容:

private static void setIntOrNull(PreparedStatement stmt, int col, Integer i)
    throws SQLException
    
        if (i == null)
            stmt.setNull(col, java.sql.Types.INTEGER);
        else
            stmt.setInt(col, i);
    

但对我来说,这种情况是一种不好的做法 - 在内部 void 方法中更改外部对象(参考Robert Martin's "Clean Code" 第 17 章:气味和启发式,函数,F2)。我尽量避免这种情况,但这一次我找不到更好的解决方案。也许有人可以帮我做一个?

【问题讨论】:

+1。我一直不明白为什么 PreparedStatement 中没有 setInteger(int position, Integer valueOrNull) 方法。以及为什么 ResultSet 中没有 Integer getNullableInteger(int position) 【参考方案1】:

我不认为这特别糟糕,真的。让我们看看:

它是void,所以它必须有副作用,否则没用 它是静态的,所以它不会对“它被调用的对象”产生任何影响;没有!

所以要么副作用将是一个全局的(例如,外部如文件系统,内部如静态变量,或临时如睡眠) 它会影响参数引用的对象之一。

int 不是一个对象,Integer 对象是不可变的,所以它唯一可以影响的是PreparedStatement。由于准备好的语句的目的之一是收集参数数据,因此该方法这样做似乎是完全合理的。方法名称使这一点更加清晰 - 如果不在准备好的语句上,它还会在哪里“设置”一个 int 或 null?

基本上:别担心 :)

可能希望通过将其移至诸如 PreparedStatementHelper 之类的公共“帮助器”类来使其更加清晰 - 这可能很明显您确实希望启用这些方法PreparedStatement,但它们不是,所以你必须有一个静态方法来作用 PreparedStatement

另一种选择是创建自己的 wrapper 类,该类将维护一个 PreparedStatement 本身,并有一个实例 setIntOrNull 方法......但从长远来看,我相信这将是更复杂,没有什么好处。

【讨论】:

以上是关于将 null 设置为 PreparedStatement的主要内容,如果未能解决你的问题,请参考以下文章

BigQuery - 将“”设置为 Null

将 null 设置为 PreparedStatement

为啥 delete 不将指针设置为 NULL?

无法将属性“innerHTML”设置为 null?

设置为null后如何将onItemClickListener重置为true?

为啥建议删除后将指针设置为null? [复制]