JDBC:空/ null结果集?

时间:2016-03-23 15:02:55

标签: sql jdbc prepared-statement h2 resultset

我正在尝试使用JDBC来更新表。该表由两个属性A和B组成。主键是A和B的复合键。它看起来像这样:

A | B
------
1 | 0
2 | 0
3 | 0
3 | 1

现在我希望能够根据我选择的A属性向此表添加新条目。它应该添加另一个,将其递增1.例如,如果我想“更新”3,表格看起来像这样:

A | B
------
1 | 0
2 | 0
3 | 0
3 | 1
3 | 2

为此,我使用预准备语句来获取任何A的最大B值。

PreparedStatement max = connection.prepareStatement("SELECT max(B) as B FROM Table WHERE A = ?");
            max.setInt(1, x);
            ResultSet rsMax = max.executeQuery();
            if(rsMax.next()) {
                /* do stuff */
            }

如果A值与x具有相同的值,那么效果非常好。 但是,当x是表中未包含的值时,我会出现异常,例如10。

我正在使用H2,当我尝试在Web界面中输入与准备好的语句(当然正确的数字)相同的查询时,结果我得到null,这就是我的假设如果在表中没有具有此值的A属性,则获取。但是,我的程序仍然进入if块,我不知道为什么。我认为如果结果集为空,这不应该发生?

我可以尝试从结果集中获取值,但是如果我想得到一个整数,我可以理解得到0.现在我可以通过没有任何A条目使用0来解决这个问题,但我怀疑这是正确的方法。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:0)

首先警告如果可能有更多并发连接到数据库,请不要使用此方法。

原因很简单,更多会话将读取最大值增加它并插入重复项。另一方面如果每次只有一个连接,这是一种有效的方法

问题是MAX函数总是返回一条记录,因此测试并不意味着完整。

检查必须检查返回的值是NULL还是NOT NULL。为此,定义了wasNull方法 - 参见下面的剪辑:

if(rs.next()) {
   ResultSet idx = rs.getInt(1)
   if  (rs.wasNull()) { idx = 0;}  // no record found - use init value
   else {idx =+ 1;}  // record found - increase the value
}