将 null 设置为 PreparedStatement
Posted
技术标签:
【中文标题】将 null 设置为 PreparedStatement【英文标题】:Setting null to PreparedStatement 【发布时间】:2012-06-01 14:49:14 【问题描述】:典型情况:我们有一些类型为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)。我尽量避免这种情况,但这一次我找不到更好的解决方案。也许有人可以帮我做一个?
【问题讨论】:
+1。我一直不明白为什么 PreparedStatement 中没有setInteger(int position, Integer valueOrNull)
方法。以及为什么 ResultSet 中没有 Integer getNullableInteger(int position)
。
【参考方案1】:
我不认为这特别糟糕,真的。让我们看看:
它是void
,所以它必须有副作用,否则没用
它是静态的,所以它不会对“它被调用的对象”产生任何影响;没有!
所以要么副作用将是一个全局的(例如,外部如文件系统,内部如静态变量,或临时如睡眠)或 它会影响参数引用的对象之一。
int
不是一个对象,Integer
对象是不可变的,所以它唯一可以影响的是PreparedStatement
。由于准备好的语句的目的之一是收集参数数据,因此该方法这样做似乎是完全合理的。方法名称使这一点更加清晰 - 如果不在准备好的语句上,它还会在哪里“设置”一个 int 或 null?
基本上:别担心 :)
您可能希望通过将其移至诸如 PreparedStatementHelper
之类的公共“帮助器”类来使其更加清晰 - 这可能很明显您确实希望启用这些方法PreparedStatement
,但它们不是,所以你必须有一个静态方法来作用 PreparedStatement
。
另一种选择是创建自己的 wrapper 类,该类将维护一个 PreparedStatement
本身,并有一个实例 setIntOrNull
方法......但从长远来看,我相信这将是更复杂,没有什么好处。
【讨论】:
以上是关于将 null 设置为 PreparedStatement的主要内容,如果未能解决你的问题,请参考以下文章