如何获取 JDBC 中的行数?
Posted
技术标签:
【中文标题】如何获取 JDBC 中的行数?【英文标题】:How do I get the row count in JDBC? 【发布时间】:2010-09-14 19:45:20 【问题描述】:我已执行 JDBC 查询以获取结果集。在迭代它之前,我想快速找出返回了多少行。我怎样才能以高性能做到这一点?
我正在使用 Java 6、Oracle 11g 和最新的 Oracle JDBC 驱动程序。
【问题讨论】:
【参考方案1】:您将不得不将其作为单独的查询来执行,例如:
SELECT COUNT(1) FROM table_name
一些 JDBC 驱动程序可能会告诉您,但这是可选行为,更重要的是,驱动程序可能还不知道。这可能是由于查询是如何优化的,例如 Oracle 中的两个示例执行策略是尽快获取所有行或尽快获取第一行。
如果您执行两个单独的查询(一个是计数,另一个是查询),那么您需要在同一个事务中执行它们。这将在 Oracle 上运行良好,但在其他数据库上可能会出现问题(例如,SQL Server 将根据您的隔离级别向您显示未提交的数据或阻止外部未提交的更新,而 Oracle 支持一个隔离级别,可为您提供事务上一致的视图数据而不阻塞外部更新)。
通常情况下,有多少行并不重要。通常,这种查询要么是批处理的,要么是分页的,无论哪种方式,您都可以以加载/处理的行的形式获得进度信息,并且您可以检测到结果集的结尾(显然)。
【讨论】:
很好的答案,虽然我不明白关于拥有进度信息的最终评论。这是哪里来的? 这需要另一个查询。如果您有可滚动的结果集,则其他答案中有更好的选择。 只有我一个人,还是这个接受的答案解决了一个完全不同的问题?给定的查询返回 table 的行数,而@cletus 想知道“在迭代之前”“返回了多少行”(ResultSet
)【参考方案2】:
ResultSet rs = stmt.executeQuery(sql);
int rowCount = rs.last() ? rs.getRow() : 0; // Number of rows in result set. Don't forget to set cyrsor to beforeFirst() row! :)
【讨论】:
效果很好。你应该补充一点,你需要一个可滚动的结果集。 支持之前的评论加上我认为这应该是正确的答案,因为它提供了一种更短更直接的方法! @Winter 移动到结果集中的最后一行(rs.last()
),然后获取行id(不要和Oracle的ROWID混淆,而是这个结果集中的行号,从 1) 开始。不要忘记使用rs.beforeFirst()
倒回结果集。【参考方案3】:
简短的回答:你不能。
长答案:您不能,部分原因是数据库可能会懒惰地评估查询,只在您要求时返回行。
编辑:使用可滚动的 ResultSet 你可以:)
确实,很久以前(早在 2001 年!)我就在 Java 数据库新闻组中问过这个问题,并且有一些 helpful responses。
【讨论】:
【参考方案4】:从 JDBC 获取行数:
ResultSet rs = st.executeQuery("select count(*) from TABLE_NAME");
rs.next();
int count = rs.getInt(1);
【讨论】:
没有人问表中有多少行,问题是结果集中有多少行。【参考方案5】:如果您的驱动程序支持(!),您可以致电ResultSet.afterLast()
ResultSet.getRow()
ResultSet.beforeFirst()
。性能可能好也可能不好。
一个更好的解决方案是重写你的算法而不需要预先设置大小。
【讨论】:
【参考方案6】:没有三元运算符
rs.last(); // Moves the cursor to the last row in this ResultSet object.
int rowCount = rs.getRow(); //Retrieves the current row number.
rs.beforeFirst(); //Moves the cursor to the front of this ResultSet object,just before the first row.
带三元运算符一行
int rowCount = rs.last() ? rs.getRow() : 0;
rs.beforeFirst();
【讨论】:
这应该可以,但值得一提的是,移动光标需要与ResultSet.TYPE_FORWARD_ONLY不同类型的结果集【参考方案7】:代码:
//Create a Statement class to execute the SQL statement
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("SELECT COUNT(*) AS COUNT FROM
TABLENAME");
while(rs.next())
System.out.println("The count is " + rs.getInt("COUNT"));
//Closing the connection
con.close();
【讨论】:
这应该是答案。完美运行。 问题是关于结果集中有多少行。不是表的行数 这是一种解决方法,但不是所需的确切方法。以上是关于如何获取 JDBC 中的行数?的主要内容,如果未能解决你的问题,请参考以下文章
如何获取 ContentEditable 区域中的行数和当前插入符号行位置?