如何检查结果集是否有一行或更多行?
如何使用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概述中的示例
有很多选项,因为你没有提供更多的上下文,唯一剩下的就是猜测。 我的答案按复杂程度和性能升序排序。
- 只需运行
select count(1) FROM ...
并获得答案。 您必须运行另一个实际选择并返回数据的查询。 - 用
rs.next()
迭代并计算,直到你开心。 然后,如果您仍然需要重新运行相同查询的实际数据。 - 如果您的驱动程序支持向后迭代,请转换
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