当前位置: 首页 > 后端技术 > Java

JAVA中如何判断一个ResultSet结果集是否为空

时间:2023-04-01 19:26:13 Java

问题描述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是否为空Listresults=newArrayList<>();while(rs.next()){intcolumnCount=rs.getMetaData().getColumnCount();对象[]行=新对象[列C伯爵];对于(inti=1;i<=columnCount;i++){row[i-1]=rs.getObject(i);}results.add(row);}if(!results.isEmpty()){//ResultSet不为空,可以读操作}else{//ResultSet为空,不能读操作}请注意在实际生产环境中,请考虑数据量和内存占用,因为所有记录CopyingtoList可能对内存有很大影响。定义一个计数变量i,每次next()都是++i,while()循环结束后,判断i是否小于等于0inti=0;while(resultSet.next()){System.out.println(...);++i;}if(i<=0)System.out.println(...);