jdbc中next()的使用

原创 2016年03月07日 16:04:48

/**
最近在使用Java实现一个业务查询的小程序。需求是根据检索业务系统表中是否存在异常的交易或申请等情况。
我的实现思路是:按照数据异常的检索条件直接从表中查询结果,然后判断结果集是否存在,如果不存在,则数据正常;如果存在,显示这些异常交易等数据
*/

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");
    }
}

/**
这样写可能会导致性能问题,但由于我所查询的表中记录数并不是很大,所以带来的影响不大。
才疏学浅,暂时没想到更好的方法。
*/

相关文章推荐

NextResult()方法

        使用数据访问类时遇到这样一种需求:在执行一个存储过程时希望返回两个结果集.按以往的做法,必定是写成两个存储过程来实现,这样数据库往返两趟,牺牲了一点效率.由于数据量大,在使用IData...
  • lincnl
  • lincnl
  • 2007年07月03日 17:26
  • 2933

关于rs.next()问题

rs.next(); -- 从查询出来的集合中拿出了一条数据 表示的集合表中的第一个对象。 如果说你在做数据库查询的时候,返回了一个Result结果集。只有一条数据是,常常很容易犯了这样的错误...

ResultSet中做if判断时next()两次取不到第一条数据的问题

JDBC判断数据库查询结果集是否为空 通常来说都是用rs.next()来判断结果集是否为空,但是由于执行rs.next()后指针指向的是结果集中的第一条记录,此时再用while(rs.next(...

if(rs.next()) 和 while(rs.next())

接口 ResultSet boolean next() throws SQLException 将光标从当前位置向前移一行。ResultSet 光标最初位于第一行之前;第一次调用 next 方...

示例学习kettle之Excel Writer步骤

通过示例学习Excel Writer步骤,简单一些,是根据模板生成excel报表的最佳方法。...

在kettle中实现数据验证和检查

利用kettle对输入数据进行验证检查,并处理跟踪错误数据。

全排列的生成使用C++的库函数:next_permutation

全排列的生成算法有很多种,有递归遍例,也有循环移位法等等。但C++/STL中定义的next_permutation和prev_permutation函数则是非常灵活且高效的一种方法,它被广泛的应用于为...

i18next的使用

i18nexti18next是一个用来支持应用国际化的javascript库。 官网链接:http://i18next.github.io/i18next/index.html 有更详细的说明和例...

Android 输入校验库简介及使用教程 - Next-Inputs

NextInputs是一个为Android/Java设计的小巧但非常强大的输入校验库,可以使得校验用户输入方便到不要不要。 NextInputs项目地址:https://github.com/yoo...
  • yoojia
  • yoojia
  • 2016年04月14日 14:59
  • 619

hexo使用next主题,并且使用”多说“给博客的文章添加评论功能

使用next主题:   1、下载next: git clone https://github.com/iissnan/hexo-theme-next themes/next 2、修改配置:_confi...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:jdbc中next()的使用
举报原因:
原因补充:

(最多只允许输入30个字)