如何获取ResultSet的行数和列数

news/2024/7/7 7:12:06 标签: java, 数据库, python

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

当我们执行数据库查询返回一个ResultSet的时候,很多情况下我们需要知道这个ResultSet的大小,即它的行数和列数。我们知道它的列数可以通过resultSet.getMetaData().getColumnCount()很容易地得到,然而,java API没有提供直接访问ResultSet行数的接口。

这个时候,有三个办法可以解决:

1.改用select count语句,然后直接从ResultSet里面获取结果:

复制代码
try {
            Statement statement = connection.createStatement();
            ResultSet resultSet = statement.executeQuery("select count(*) as rowCount from tableName");
            resultSet.next(); int rowCount = resultSet.getInt("rowCount");
        } catch (Exception e) { // TODO: handle exception  e.printStackTrace();
        }
复制代码

但是,我们执行数据库查询不光要知道结果的行数,往往接下来还要用到查询结果。如果用此方法,还需要再执行一次select语句,才能得到想要的结果集,这样,就多了一次数据库查询,大大降低了执行速度。

2.遍历Resultset,用一个变量记录行数。代码如下:

复制代码
int count = 0; try { while(resultSet.next()){
                count = count + 1;
            }
        } catch (SQLException e1) { // TODO Auto-generated catch block  e1.printStackTrace();
        }
复制代码

这样获取的count值就是结果集的行数。然而,这种方法同第一种方法的问题一样,不能再使用结果集了。因为这时候指针已经移动到结果集的外面了,不再指向任何记录。

3.知道了第二种方法中问题的原因,我们就知道如何更好地解决这个问题了。第二种方法的问题在于返回的结果集中的指针不能自由移动,幸好java为我们提供了选择,可以让我们创建指针可以自由移动的结果集,所需要做的只有一件事,就是在创建Statement的时候,加上两个参数:

复制代码
try { //Statement statement = connection.createStatement();  Statement statement = connection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
            ResultSet resultSet = statement.executeQuery("select * from " + tableName);
        } catch (Exception e) { // TODO: handle exception  e.printStackTrace();
        }
复制代码

这样获得的结果集,指针就可以在其中自由移动。然后,就可以用如下方法获取结果集的行数:

复制代码
int rowCount = 0; try {
            resultSet.last();
            rowCount = resultSet.getRow();
        } catch (Exception e) { // TODO: handle exception  e.printStackTrace();
        }
复制代码

其中resultSet.last()就是将指针移动到结果集的最后一条记录;然后用resultSet.getRow()获取指针当前所在的行号(从1开始)

如果接下来你还要使用结果集,别忘了将指针移到第一行:

resultSet.first();

既然结果集是可滚动的,当然可以用absolute()方法访问指定行号的记录:

boolean java.sql.ResultSet.absolute(int row) throws SQLException

其中row参数可正可负,具体含义查一下ResultSet的absolute()方法就知道了。

转载于:https://my.oschina.net/liangtee/blog/86591


http://www.niftyadmin.cn/n/1673932.html

相关文章

Tcl学习之--命名空间

Tcl解释器将全部的命令和全局变量分组管理。这些小组称为命名空间,一个命名空间中的命令和变量不会影响到还有一个命名空间。这些命名空间呈树形组织。一个命名空间的命令能够被还有一个命名空间引入。命名空间树的根就是全局命名空间,它包括了没有明白在…

dom 修改xml java_如何使用DOM方式修改XML文件内容

如何使用DOM方式修改XML文件内容发布时间:2020-07-09 15:23:57来源:亿速云阅读:125作者:Leah本篇文章为大家展示了如何使用DOM方式修改XML文件内容,代码简明扼要并且容易理解,绝对能使你眼前一亮&#xff0…

1.3.3、Java基础下__二维数组理解,定义,初始化,长度

Java系列文章目录 作者:Dcc_BigData 文章目录Java系列文章目录前言1、对于二维数组的理解2、二维数组定义格式(2种)3、二维数组的初始化4、动态初始化:5、静态初始化6、数组的长度7、数组元素的默认初始化值总结前言 本文要记录的大概内容: 二维数组理解…

c语言 函数多个参数,用C语言实现参数个数可变的函数

采用C语言编程的时候,函数中形式参数的数目通常是确定的,在调用时要依次给出与形式参数对应的所有实际参数。但在某些情况下希望函数的参数个数可以根据需要确定。典型的例子有大家熟悉的函数printf()、scanf()和系统调用execl()等。那么它们是怎样实现的…

c语言编程求预测子女身高,C语言的那些题(三) —— 编程计算身高问题完善版

发上去以后,一位看到我文章的朋友告诉我,代码逻辑上有点问题,而且分支结构过多,会在以后开发过程中影响程序运行效率,于是他告诉我应该完善哪些地方.很高兴他能够抽出时间阅读我的文章,并且花时间告诉我存在的问题.希望其他朋友也能多提意见,大家一起学习.听取了我那位朋友的意…

java生产校验码

2019独角兽企业重金招聘Python工程师标准>>> 有两种方式&#xff0c;一种jsp方式&#xff0c;一种java方式&#xff08;该方式自己改造的&#xff09; 【采用jsp方式】 服务端生成代码&#xff1a; <% page contentType"image/jpeg"import"java…

Create, Save, and Open Trace Documents

Create, Save, and Open Trace Documents 在仪器中&#xff0c;所有的工作都是在跟踪文档中完成的&#xff0c;其中包含一组工具、它们的配置设置和它们收集的数据。一旦您使用跟踪文档来配置应用程序&#xff0c;就可以保存文档以保存收集的跟踪数据&#xff0c;并稍后再打开以…

java怎么设计好看的界面_问下JAVA做出来的程序怎么把界面改的好看点啊

问下JAVA做出来的程序怎么把界面改的好看点啊RT~~~谢谢大家指教搜索更多相关的解决方案:JAVA 界面----------------解决方案--------------------------------------------------------别费这个劲了.----------------解决方案-----------------------------------------------…