如何使用JDBC检查结果集是否有一行或更多行?
答案 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(*)
单独进行查询,以获取记录计数,但请注意,计数只是近似值,因为可以在执行两个查询所需的时间之间添加或删除行。
答案 1 :(得分:1)
有很多选项,因为你没有提供更多的上下文,唯一剩下的就是猜测。我的答案按复杂程度和性能升序排序。
select count(1) FROM ...
即可获得答案。您必须运行另一个实际选择并返回数据的查询。rs.next()
进行迭代并计算,直到您满意为止。然后,如果您仍然需要重新运行相同查询的实际数据。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
缺点:
- 在此实现中,部分代码将重复。
- 您不知道结果中有多少行。
答案 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