获取Java结果集中的行数

获取Java结果集中的行数,java,mysql,jdbc,Java,Mysql,Jdbc,有人知道更好的方法来获取从MySQL数据库返回的Java结果集中的行数吗?返回的resultset不是从数据库读取的总行数,因此我认为我不能使用SQL的COUNTaggregate函数 public static int getResultSetRowCount(ResultSet resultSet) { int size = 0; try { resultSet.last(); size = resultSet.getRow();

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

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

SELECT FOUND_ROWS()

执行SELECT语句后立即查找行数。

在执行实际的
SELECT

之前,始终可以在相同的确切条件下使用
SELECT count()
。更好的答案是,在将结果集成功加载到对象或集合之前,忽略行数。您可以使用这些选项中的任何一个来保持行数的计数

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


停止考虑数据库,开始考虑对象。Java是一种面向对象的语言。

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

请参见下面的示例代码:

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

希望这对我有帮助

这是我对这个问题的解决方案(因为我主要希望返回的记录数能够构建一个数组或类似的东西):使用一个集合,例如

公共向量getRecords(){ 向量记录=新向量(); init_conn_和stmt_和_rs(); 试一试{ rs=stmt.executeQuery(“从`table`中选择*,其中`something`=0”); while(rs.next()){ //在这里加载向量。 } }捕获(SQLE异常){ e、 printStackTrace(); }最后{ 关闭rs_和stmt_和_conn(); } 退货记录; }
干净简单,不是吗?适用于返回的任何大小记录集(无需事先知道大小),并使所有
列表
方法可用


这对我来说已经有一段时间了,但是如果有人看到了其中的缺陷,请告诉我。总是想让我的练习做得更好,你知道。

你也可以使用以下方法获得结果集中的总记录:

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

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

调用resultSet.last()将导致结果集实际遍历所有记录,因此显然效率低下。而且,即使您还不需要,它也会强制将所有数据缓存到内存中。你为什么说“返回的结果集不是从数据库读取的总行数”?@RonK:你认为它为什么会到处重复?我在文档中找不到类似的内容。@Ronk:从数据库表中读取的数据将只是表数据的一个子集,而不是表中的所有数据。不过我对“遍历”很好奇。@Adeel Ansari:我不是100%确定,我反编译了Oracle的结果集,发现在调用“last()”方法的流程中调用了“cacheAllRows()”方法,该方法以“while(resultSet.next())”开头。我认为MySQL驱动程序不会有更好的工作要做。@Morgan先生:正如下面的一些答案所述-如果您有一个SQL来获取数据,您可以使用相同的SQL来返回COUNT()-我看不出它不能工作的原因。@Morgan先生:这对我来说很好。实际上,我们做了类似的事情来实现分页。然而,我们在第二个查询中询问具体的行数。但是在你的例子中,
duffymo
非常正确。当你已经查询了数据库,为什么不把它加载到一个列表或者别的什么东西中呢?我现在正在按照达菲莫的想法看一个二维数组列表。以前,我需要resultset的行数来计算二维字符串数组的大小。或者,当我试图从系统架构访问表元数据时,我可以使用一个包含两个字段的类:列名、列类型,然后创建该类的数组列表。这里的要点是避免迭代结果集,集合中的这个类应该足够了。(+1)当然,你是对的
count()
对我来说很好,但在这种情况下不行。我们通常这样做是为了实现分页。我发现自己想知道行数,这样我就可以制作一个大小合适的
ArrayList
。我的意思是,摊余成本可以忽略不计,但如果我第一次就能够做到,为什么不正确呢?:-)在Java的现代版本中尝试使用资源是确保数据库对象在完成时关闭的一个好方法。这在MySQL中并不真正起作用。即使有一行,我也只能得到-1。只有结果集是可滚动的,它才能工作,而且它会在所有记录上迭代,所以效率不是很高。这是一个有趣的答案。您能提供实现这一点的java代码吗?
statement = connect.createStatement();
resultSet = statement.executeQuery(sqlStatement);
resultSet.last();
int count = resultSet.getRow();
System.out.println(count);