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位置)
。