典型情况:我们有一些类型为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)。我尽量避免这种情况,但这次我找不到更好的解决方案。也许有人可以帮我一个人?
答案 0 :(得分:5)
我认为这不是特别糟糕,真的。我们来看看:
void
,所以它必须有副作用,或无用所以要么副作用将是全局的(例如外部,例如文件系统,内部例如静态变量,或时间例如睡觉)或它会影响参数引用的其中一个对象。
int
不是对象,Integer
对象是不可变的,因此它可能影响的唯一事物是PreparedStatement
。由于准备语句的目的之一是收集参数数据,因此该方法将这样做似乎是完全合理的。方法名称使这更加清晰 - 如果不是在准备好的语句中,它还会“设置”一个int或null?
基本上:别担心:)
在PreparedStatementHelper
上,但他们并非如此,您必须使用静态方法来代理 PreparedStatement
。
另一种方法是创建自己的包装器类,它本身会维护PreparedStatement
,并且有一个实例PreparedStatement
方法......但从长远来看,我相信这会更复杂,收效甚微。