问题描述ResultSet表示select语句的查询结果集。ResultSet对象有一个指向其当前数据行的指针。最初,指针放在第一行记录之前,可以通过next()方法将指针移动到下一行记录。next()方法在ResultSet对象没有一行记录时返回false,所以可以用在while循环中遍历结果集,也可以用来判断结果集是否为空。示例代码如下://这里省略连接数据库的代码...Statementstmt=conn.createStatement();ResultSetrs=stmr.executeQuery("select*fromTest");if(rs.next()){System.out.println("结果集不为空!");}else{System.out.println("结果集为空!");}这时候,第一个陷阱出现了:Java的ResultSet对象,默认是禁用Updated的,只是一个向前移动的指针。所以只能遍历一次,而且只能按照从第一行到最后一行的顺序。使用rs.next()判断时,第一行数据会丢失。这也是我一开始遇到的问题。排查问题遇到ResultSet的Type属性的问题后,我的第一个想法是在搜索引擎上搜索相关的解决方案,但看了一圈后,有以下“解决方案”:调用rs.last()方法得到将ResultSet中记录的记录总数,然后调用rs.beforeFirst()方法将光标移回第一条记录的前面。这个方法貌似可行,但是当我实际修改并运行它时,出现错误OperationnotallowedforaresultsetoftypeResultSet.TYPE_FORWARD_ONLY。这是什么原因?出现这个错误的主要原因是:ResultSet.TYPE_FORWARD_ONLY类型的ResultSet只允许向前遍历,不支持访问以前的记录或确定它们的大小。因此,使用last()和getRow()等方法是行不通的。ResultSet的Type属性有以下类型:参数类型说明ResultSet.TYPE_FORWORD_ONLY结果集的游标只能向下滚动ResultSet.TYPE_SCROLL_INSENSITIVE结果集的游标可以上下移动。当数据库发生变化时,当前结果集保持不变ResultSet.TYPE_SCROLL_SENSITIVE返回一个可滚动的结果集,当数据库发生变化时,当前结果集同步变化等同于:createStatement(ResultSet.TYPE_FORWORD_ONLY,ResultSet.CONCUR_READ_ONLY);即结果集的游标只能向下滚动,所以OperationnotallowedforaresultSet.TYPE_FORWARD_ONLY类型的结果集报错。就会出现,也就是ResultSet。默认情况下,next()方法只能用于逐行向前移动光标。它不支持last()、first()和absolute()等方法。如果要使用last()、absolute()等方法,则必须在Connection生成Statement时指定相应的参数。格式如下:语句stmt=conn。ctrateStatement(游标类型,记录更新权限);解决方案手动指定游标类型Statementstmt=conn.createStatement(ResultSet.TYPE_SCOLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);将ResultSet的内容复制到一个List中,然后检查List是否为空List
