获取Java结果集中的行数

时间:2010-06-16 11:11:06

标签: java mysql jdbc

有没有人知道从MySQL数据库返回的Java结果集中获取行数的更好方法?返回的结果集不会是从数据库中读取的总行数,因此我认为我不能使用SQL的COUNT聚合函数。

public static int getResultSetRowCount(ResultSet resultSet) {
    int size = 0;
    try {
        resultSet.last();
        size = resultSet.getRow();
        resultSet.beforeFirst();
    }
    catch(Exception ex) {
        return 0;
    }
    return size;
}

7 个答案:

答案 0 :(得分:21)

更好的答案是在成功将ResultSet加载到对象或集合之前忘记行数。您可以使用这些选项中的任何一个来保留行数。

在尽可能最窄的方法范围内关闭ResultSets(以及Connection和Statement等所有SQL资源)非常重要。这意味着不将ResultSet传递出持久层。最好使用Collection size()调用来获取行数。

不再考虑数据库并开始考虑对象。 Java是一种面向对象的语言。

答案 1 :(得分:9)

您可以执行

SELECT FOUND_ROWS()
执行SELECT语句后立即

查找行数。

答案 2 :(得分:2)

在制作实际SELECT COUNT()之前,您始终可以使用具有相同条件的SELECT

答案 3 :(得分:2)

如果您使用的是Java 6,则可以使用JDBC4ResultSet类,该类具有getUpdateCount方法,该方法返回受SQL语句影响的行数,即使对于Select语句也是如此。

见下面的示例代码:

PreparedStatement ps = con.prepareStatement("select * from any_table ...");
JDBC4ResultSet rs = (JDBC4ResultSet)ps.executeQuery();
int rowNumber = rs.getUpdateCount();

我希望有这个帮助!

答案 4 :(得分:2)

这是我对这个问题的解决方案(因为我主要想要返回构建数组或类似内容的记录数):使用Vector<T>之类的集合。

public Vector<T> getRecords(){
   Vector<T> records = new Vector<T>();
   init_conn_and_stmt_and_rs();

   try {
      rs = stmt.executeQuery("SELECT * FROM `table` WHERE `something` = 0");
      while(rs.next()){
         // Load the Vector here.
      }
   } catch (SQLException e) {
      e.printStackTrace();
   }finally{
      close_rs_and_stmt_and_conn();
   }
   return records;
}

清洁简单,不是吗?返回任何大小的记录集(无需事先知道大小),并使所有List方法可用。

这对我来说已经有一段时间了,但如果有人看到这方面的缺陷,请告诉我。你知道,总是希望让我的实践更好。

答案 5 :(得分:1)

您还可以使用以下方法获取resultSet中的总记录:

statement = connect.createStatement();
resultSet = statement.executeQuery(sqlStatement);
resultSet.last();
int count = resultSet.getRow();
System.out.println(count);

count 是结果集返回的总行数。 ;)

答案 6 :(得分:0)

请参阅以下Lalith解决方案的示例代码:

public static int getResultSetRowCount(connection) {
    int size = 0; 
    statement = connection.createStatement(); 
    try {
        resultSet = statement.executeQuery("SELECT FOUND_ROWS()")
        resultSet.next()
        size = resultSet.getInt(1)
    }
    catch(Exception ex) {
        return 0;
    }
    statement.close();
    return size;
}