resultset遍历需先调用next()移动游标至首行,再用getxxx()读值;默认单向只读一次有效,重复遍历需缓存或重查;可滚动类型支持first()/last()等;必须显式关闭资源,推荐try-with-resources。

ResultSet 遍历的核心是用 next() 方法逐行移动游标,配合 getXXX() 方法读取列值。默认 ResultSet 的游标初始位置在第一行之前,必须先调用 next() 才能访问首行数据。
基本遍历方式:while(next()) 循环
这是最常用、最安全的遍历写法:
- 每次调用 next() 将游标下移一行,返回 true 表示有数据,false 表示已到末尾
- 在循环体内用 getString("name")、getInt(1) 等方法获取当前行各列值
- 列名不区分大小写,列索引从 1 开始(不是 0)
示例:
while (rs.next()) {
String name = rs.getString("username");
int age = rs.getInt("age");
System.out.println(name + ", " + age);
}
注意游标位置和多次遍历限制
ResultSet 默认是**单向、只读、一次有效**的:
- 游标只能从前往后移动,不能倒退或重置(除非创建时指定可滚动类型)
- 遍历完一遍后,再次调用 next() 会直接返回 false
- 如需重复使用结果,要么重新执行查询,要么把数据缓存到 List 或其他集合中
可滚动 ResultSet 的用法(进阶)
如果需要反复访问或反向遍历,可在创建 Statement 时指定参数:
- ResultSet.TYPE_SCROLL_INSENSITIVE:支持前后滚动,但不反映数据库实时变更
- ResultSet.CONCUR_READ_ONLY:只读(最常用)
- 组合使用:
conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY)
之后可用 first()、last()、previous()、absolute(n) 等方法控制游标。
别忘了关闭资源
ResultSet 必须显式关闭,否则可能造成连接泄漏:
- 推荐使用 try-with-resources 自动关闭(JDK 7+)
- 确保 ResultSet、Statement、Connection 按相反顺序关闭(rs → stmt → conn)
示例:
try (ResultSet rs = stmt.executeQuery("SELECT * FROM user")) {
while (rs.next()) {
// 处理数据
}
} // 自动关闭 rs
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











