如何获取ResultSet的行数和列数
1个回答
推荐于2016-08-31 · 知道合伙人影视综艺行家
关注
展开全部
当我们执行数据库查询返回一个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();introwCount = resultSet.getInt("rowCount");}catch(Exception e) {//TODO:handle exception
e.printStackTrace();}但是,我们执行数据库查询不光要知道结果的行数,往往接下来还要用到查询结果.如果用此方法,还需要再执行一次select语句,才能得到想要的结果集,这样,就多了一次数据库查询,大大降低了执行速度.
2.遍历Resultset,用一个变量记录行数.代码如下:intcount = 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();}这样获得的结果集,指针就可以在其中自由移动.然后,就可以用如下方法获取结果集的行数:introwCount = 0;try{resultSet.last();
rowCount = resultSet.getRow();}catch(Exception e) {//TODO:handle exception
e.printStackTrace();}其中resultSet.last()就是将指针移动到结果集的最后一条记录;然后用resultSet.getRow()获取指针当前所在的行号(从1开始)
如果接下来你还要使用结果集,别忘了将指针移到第一行:
resultSet.first();
既然结果集是可滚动的,当然可以用absolute()方法访问指定行号的记录:
其中row参数可正可负,具体含义查一下ResultSet的absolute()方法就知道了.
这个时候,有三个办法可以解决:
1.改用select count语句,然后直接从ResultSet里面获取结果:try{Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery("select count(*) as rowCount from tableName");
resultSet.next();introwCount = resultSet.getInt("rowCount");}catch(Exception e) {//TODO:handle exception
e.printStackTrace();}但是,我们执行数据库查询不光要知道结果的行数,往往接下来还要用到查询结果.如果用此方法,还需要再执行一次select语句,才能得到想要的结果集,这样,就多了一次数据库查询,大大降低了执行速度.
2.遍历Resultset,用一个变量记录行数.代码如下:intcount = 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();}这样获得的结果集,指针就可以在其中自由移动.然后,就可以用如下方法获取结果集的行数:introwCount = 0;try{resultSet.last();
rowCount = resultSet.getRow();}catch(Exception e) {//TODO:handle exception
e.printStackTrace();}其中resultSet.last()就是将指针移动到结果集的最后一条记录;然后用resultSet.getRow()获取指针当前所在的行号(从1开始)
如果接下来你还要使用结果集,别忘了将指针移到第一行:
resultSet.first();
既然结果集是可滚动的,当然可以用absolute()方法访问指定行号的记录:
其中row参数可正可负,具体含义查一下ResultSet的absolute()方法就知道了.
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询