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

时间:2010-04-07 10:48:10

标签: java sql jdbc resultset

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

8 个答案:

答案 0 :(得分:29)

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 Overview

的示例

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

List<Item> 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<Item> list() throws SQLException {
    Connection connection = null;
    Statement statement = null;
    ResultSet resultSet = null;
    List<Item> items = new ArrayList<Item>();

    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;
}

答案 3 :(得分:0)

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

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

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

答案 4 :(得分:0)

如果您想确保 完全 一行,您可以确保第一行是最后一行:

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.    
    // .. 
}

答案 5 :(得分:0)

  

此实现使您可以检查查询结果是否为空,但要花费一些行。

std::this_thread::sleep_for

缺点:

  
      
  1. 在此实现中,部分代码将重复。
  2.   
  3. 您不知道结果中有多少行。
  4.   

答案 6 :(得分:-2)

public int rowCountValue(ResultSet rsValue) throws SQLException {
    ResultSet rowCountValue = rsValue;
    int countRow = 0;
    while (rowCountValue.next()) {
        countRow++;
    }
    return countRow;
}

答案 7 :(得分:-4)

使用ResultSetMetaData类获取行计数。

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

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