如何获取ResultSet的行数和列数

当咱们执行数据库查询返回一个ResultSet的时候,不少状况下咱们须要知道这个ResultSet的大小,即它的行数和列数。咱们知道它的列数能够经过resultSet.getMetaData().getColumnCount()很容易地获得,然而,java API没有提供直接访问ResultSet行数的接口。 java

这个时候,有三个办法能够解决: sql

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语句,才能获得想要的结果集,这样,就多了一次数据库查询,大大下降了执行速度。 spa

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

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

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

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

复制代码
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();
        }
复制代码

这样得到的结果集,指针就能够在其中自由移动。而后,就能够用以下方法获取结果集的行数: blog

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

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

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

resultSet.first();

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

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

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

相关文章
相关标签/搜索