2012-06-01 141 views
4

典型情况:我们有一些类型为Integer的可为空的列,它可能是null或某些int值。因此,我们使用以下命令:将null设置为PreparedStatement

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); 
    } 

但对于我这种情况是怎么样的坏习惯 - 到内部空隙更改方法中的外部对象(reffering到Robert Martin's "Clean Code"第17章:气味和启发,功能,F2)。我尽量避免这种情况,但是这次我找不到更好的解决方案。也许有人可以帮我一个吗?

+1

+1。我从来没有理解为什么PreparedStatement中没有'setInteger(int position,Integer valueOrNull)'方法。为什么ResultSet中没有'Integer getNullableInteger(int position)'。 –

回答

5

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

  • 这是void,所以必须有副作用,或者是无用
  • 它是静态的,所以也没有对的“这就是所谓的对象”的任何影响;没有一个!

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

int不是一个对象,Integer对象是不可改变的,所以只事情可以影响是PreparedStatement。由于准备好的陈述的目的之一是收集参数数据,所以该方法将这样做是完全合理的。这个方法的名称使得它更加清晰 - 除非准备好的语句上,否则会在哪里“设置”一个int或null?

基本上是:不要担心:)

可能想将它移动到一个公共的“助手”类,如PreparedStatementHelper,使这个更加清晰 - 这使得它有可能很明显,你真的会像这些方法在PreparedStatement,但他们不是这样,你必须有一个静态方法,而不是作用于 a PreparedStatement

一种选择是创建你自己的包装类,它会保持一个PreparedStatement本身,有一个实例setIntOrNull方法......但是从长远来看,我相信这将是一个复杂多了,对于没有什么好处。