如何验证JDBC查询结果是否包含数据?
解决JDBC查询结果断言无数据的问题
你的代码未生效的核心原因是ResultSet的初始游标位置在第一行数据之前,直接调用rs.getRow()会返回0,无法正确反映结果集的真实行数;另外如果之前已经移动过游标,rs.next()的判断结果也会出错。
正确的解决方案分两种场景:
场景1:仅需验证结果集是否包含数据
不需要额外统计行数,直接通过rs.next()的返回值断言,这是最简洁高效的方式:
// 断言结果集存在数据,无数据时断言失败 Assert.assertTrue(rs.next()); // 如果之后还需要遍历结果集,可将游标回退到初始位置(需ResultSet支持滚动) rs.previous();
场景2:需要打印总行数并验证数据存在
默认的ResultSet是不可滚动的,无法直接跳到最后一行统计行数,需要创建Statement时指定游标类型:
// 创建支持滚动的Statement,允许移动游标到任意位置 Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); ResultSet rs = stmt.executeQuery("你的SQL查询语句"); // 移动游标到最后一行,获取总行数 rs.last(); int rowCount = rs.getRow(); System.out.println("Table contains " + rowCount + " rows"); // 将游标移回初始位置,方便后续遍历(如果需要) rs.beforeFirst(); // 断言行数大于0,无数据时断言失败 Assert.assertTrue(rowCount > 0);
注意事项
- 确保在执行断言逻辑前,ResultSet的游标处于初始位置(beforeFirst),如果之前已经调用过
rs.next()等方法移动过游标,会导致判断结果错误。 - 若使用不可滚动的ResultSet,调用
rs.last()会抛出SQLException,必须指定正确的Statement类型。
内容的提问来源于stack exchange,提问作者Harika
相关产品推荐
相关产品推荐

