如何检查结果集是否有一行或更多行?

如何使用JDBC检查结果集是否有一行或更多行?

ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table1"); boolean isMoreThanOneRow = rs.first() && rs.next(); 

你没有问这个,但你可能需要它:

 boolean isEmpty = ! rs.first(); 

通常,我们不需要行计数,因为我们使用WHILE循环迭代结果集而不是FOR循环:

 ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table1"); while (rs.next()) { // retrieve and print the values for the current row int i = rs.getInt("a"); String s = rs.getString("b"); float f = rs.getFloat("c"); System.out.println("ROW = " + i + " " + s + " " + f); } 

但是,在某些情况下,您可能希望窗口显示结果,并且您需要提前记录计数以向用户显示类似于Row 1 to 10 of 100 。 您可以首先使用SELECT COUNT(*)执行单独的查询以获取记录计数,但请注意,计数只是近似值,因为可以在执行两个查询所花费的时间之间添加或删除行。

ResultSet概述中的示例

有很多选项,因为你没有提供更多的上下文,唯一剩下的就是猜测。 我的答案按复杂程度和性能升序排序。

  1. 只需运行select count(1) FROM ...并获得答案。 您必须运行另一个实际选择并返回数据的查询。
  2. rs.next()迭代并计算,直到你开心。 然后,如果您仍然需要重新运行相同查询的实际数据。
  3. 如果您的驱动程序支持向后迭代,请转换rs.next()几次,然后使用rs.previous()回退。

你不需要JDBC。 通常的习惯用法是收集集合中的所有结果并使用集合方法,例如List#size()

 List items = itemDAO.list(); if (items.isEmpty()) { // It is empty! if (items.size() == 1) { // It has only one row! } else { // It has more than one row! } 

list()方法看起来像什么:

 public List list() throws SQLException { Connection connection = null; Statement statement = null; ResultSet resultSet = null; List items = new ArrayList(); try { connection = database.getConnection(); statement = connection.createStatement(); resultSet = statement.executeQuery(SQL_LIST); while (resultSet.next()) { Item item = new Item(); item.setId(resultSet.getLong("id")); item.setName(resultSet.getString("name")); // ... items.add(item); } } finally { if (resultSet != null) try { resultSet.close(); } catch (SQLException logOrIgnore) {} if (statement != null) try { statement.close(); } catch (SQLException logOrIgnore) {} if (connection != null) try { connection.close(); } catch (SQLException logOrIgnore) {} } return items; } 

我的明白建议:获取第一个结果行,然后尝试获取下一行。 如果尝试成功,则您有多行。

如果有多行并且您想要处理该数据,则需要缓存第一行中的内容,或者使用可滚动的结果集,以便在查看结果之前可以回到顶部。

您还可以通过对查询的其余部分执行SELECT COUNT(*)直接向SQL请求此信息; 结果将为0,1或更多,具体取决于查询的其余部分将返回多少行。 这很容易实现,但涉及到DB的两个查询,假设您将要读取并处理下一个实际查询。

如果要确保只有一行,可以确保第一行是最后一行:

 ResultSet rs = stmt.executeQuery("SELECT a FROM Table1 WHERE b=10"); if (rs.isBeforeFirst() && rs.next() && rs.isFirst() && rs.isLast()) { // Logic for where there's exactly 1 row Long valA = rs.getLong("a"); // ... } else { // More that one row or 0 rows returned. // .. } 
 public int rowCountValue(ResultSet rsValue) throws SQLException { ResultSet rowCountValue = rsValue; int countRow = 0; while (rowCountValue.next()) { countRow++; } return countRow; } 

使用ResultSetMetaData类获取行计数。

从您的代码中,您可以创建ResultSetMetaData如:

 ResultSetMetaData rsmd = resultSet.getMetaData(); //get ResultSetMetaData rsmd.getColumnCount(); // get row count from resultsetmetadata