Java 将null设置为PreparedStatement

Java 将null设置为PreparedStatement,java,jdbc,null,prepared-statement,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); els

典型情况:我们有一些类型为
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);
    }

但对我来说,这种情况是一种糟糕的做法——在内部无效方法中改变外部对象(参考第17章:气味和启发式,函数,F2)。我试图避免这种情况,但这次我找不到更好的解决办法。也许有人能帮我做一个?

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

  • 它是无效的,所以它肯定有副作用,或者是无用的
  • 它是静态的,所以它不能对“它被调用的对象”产生任何影响;没有一个
因此,要么副作用是全局性的(例如,外部的,如文件系统;要么是内部的,如静态变量;要么是暂时的,如休眠),要么会影响参数所指的一个对象

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

基本上:别担心:)

您可能希望通过将其移动到公共“helper”类(如
PreparedStatementHelper
)来更清楚地说明这一点,这使得您很可能希望这些方法位于
PreparedStatement
上,但事实并非如此,因此必须使用静态方法来处理
PreparedStatement


另一种方法是创建自己的包装器类,该类将维护
PreparedStatement
本身,并具有一个实例
setIntOrNull
方法。。。但从长远来看,我认为这将是一个复杂得多的过程,几乎没有什么好处。

+1。我一直不明白为什么PreparedStatement中没有
setInteger(int位置,Integer-valueOrNull)
方法。以及为什么ResultSet中没有
整数getNullableInteger(int位置)