将null设置为PreparedStatement

时间:2012-06-01 14:49:14

标签: java jdbc null prepared-statement

典型情况:我们有一些类型为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 个答案:

答案 0 :(得分:5)

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

  • 它是void,所以它必须有副作用,或无用
  • 它是静态的,因此它不会对“它被称为的对象”产生任何影响;没有一个!

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

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

基本上:别担心:)

PreparedStatementHelper上,但他们并非如此,您必须使用静态方法来代理 PreparedStatement

另一种方法是创建自己的包装器类,它本身会维护PreparedStatement,并且有一个实例PreparedStatement方法......但从长远来看,我相信这会更复杂,收效甚微。

相关问题