gpt4 book ai didi

java - 将 null 设置为 PreparedStatement

转载 作者:搜寻专家 更新时间:2023-11-01 02:30:24 24 4
gpt4 key购买 nike

典型情况:我们有一些类型为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)。我尽量避免这种情况,但这次我找不到更好的解决方案。也许有人可以帮我做一个?

最佳答案

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

  • 它是void,所以它必须有副作用,否则就没用了
  • 它是静态的,所以它不会对“它所调用的对象”产生任何影响;没有一个!

所以 要么副作用将是全局的(例如文件系统之类的外部,静态变量之类的内部,或 sleep 之类的暂时性副作用) 它将影响参数引用的对象之一。

int 不是对象,Integer 对象是不可变的,所以唯一它可以影响的是 准备好的语句。由于准备语句的目的之一是收集参数数据,因此该方法这样做似乎是完全合理的。方法名称使这一点更加清晰 - 如果不在准备好的语句中,它还会在哪里“设置”一个 int 或 null?

基本上:别担心:)

可能希望通过将其移至公共(public)“帮助程序”类(例如 PreparedStatementHelper)来使其更加清晰 - 这可能很明显您确实想要这些方法在 PreparedStatement 上,但它们不是,所以您必须有一个静态方法来作用于 PreparedStatement

一种替代方法是创建您自己的包装器 类,它维护一个PreparedStatement 本身,并有一个实例setIntOrNull 方法...但从长远来看,我相信这会复杂得多,而且收效甚微。

关于java - 将 null 设置为 PreparedStatement,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10852512/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com