将null设置为PreparedStatement

Ale*_*aev 4 java null jdbc 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);
    }
Run Code Online (Sandbox Code Playgroud)

但对我来说这种情况下是一种不好的做法-以内部空隙更改方法中的外部对象(reffering到罗伯特·马丁的"清洁守则"第17章:气味和启发,功能,F2).我尽量避免这种情况,但这次我找不到更好的解决方案.也许有人可以帮我一个人?

Jon*_*eet 5

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

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

所以无论是副作用将是一个全球性的一个(例如外部诸如文件系统,内部如静态变量,或时间例如睡眠)它会影响由参数所指的对象之一.

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

基本上:别担心:)

可能希望通过将它移动到一个公共的"助手"类来更清楚地表达这一点PreparedStatementHelper- 这使得你可能很明显你真的想要使用这些方法PreparedStatement,但它们并非如此,你必须拥有它一个静态方法,而不是作用于一个PreparedStatement.

一种替代方法是创建自己的包装类,它将维护一个PreparedStatement自身,并有一个实例setIntOrNull方法......但从长远来看,我认为这将更复杂,几乎没有什么好处.