jdbc中,预编译SQL语句后,我们经常使用如下方式来判断结果集的状态:
while (result.next()) {
//code...
result.getString("id");
}
而我在使用的过程中,需要首先判断结果集中是否存在数据,于是就使用了if进行判断,如下:
if (!result.next()) {
//code...
}
然后问题就出现了,通过判断得知结果集存在(有异常交易等数据),但无法从结果集中取出数据。代码如下:
if (!result.next()) {//数据正常
//code...
} else {//数据异常
//通过while循环遍历取出数据
while (result.next()) {
//code...
result.getString("id");
}
}
这种写法有个问题是:当结果集中只有一条记录时,会跳过while循环,也就得不到正常的确认结果。
出现问题的原因在于next()方法的用法:
next()方法用来判断下一条记录是否存在,执行一次,游标就后移一次。初始情况下,游标位于第一条记录之前,也就是说执行一次后,游标移动到第一条记录的位置,随着循环调用依次后移,移动到最后一条记录之后时结束。
如果,结果集中只存在一条记录,那么执行一次后,游标移动到该条记录位置。当再次调用next()方法时,游标就会移动到该条记录之后,那么执行就会结束。
上述代码中,因为在使用if判断时调用了一次next()方法,所以,当遇到结果集中只有一条记录的情况时,接下来在else分支中再次调用next()时就取不到结果了。
我在解决这个问题时,用了个笨办法,即:
if (!result.next()) {//数据正常
//code...
} else {//数据异常
//关闭结果集,然后重新进行执行查询
result.close();
result = pre.executeQuery();
//通过while循环遍历取出数据
while (result.next()) {
//code...
result.getString("id");
}
}