Java中遍历ResultSet需用while(rs.next())推进游标(初始在第一行前),再调用getXXX()按列名或索引取值;务必用try-with-resources及时关闭rs、stmt、conn;默认为单向只读,可滚动需显式指定类型。

Java 中使用 ResultSet 遍历数据库查询结果集,核心是调用 next() 方法推进游标,并配合 getXXX() 方法读取各列数据。关键在于理解游标初始位置(在第一行之前)、遍历边界和资源安全释放。
用 while (rs.next()) 正确遍历每一行
ResultSet 的游标默认位于第一行的前面,next() 会将游标移动到下一行并返回 true(如果存在该行),否则返回 false。因此标准写法是:
- 用
while (rs.next())循环,每次进入循环体时游标已指向有效数据行 - 不要先调用
rs.first()或rs.absolute(1)—— 大多数 JDBC 驱动默认返回的是 forward-only 结果集,不支持反向或随机定位 - 若需判断是否有数据,可用
if (rs.next()) { ... } else { /* 无结果 */ },但注意此时已跳过第一行
按列名或列索引获取字段值
在 rs.next() 返回 true 后,即可安全调用 getXXX() 方法读取当前行数据:
- 推荐用列名:如
rs.getString("username")、rs.getInt("id")—— 可读性强,与 SQL 字段顺序解耦 - 也可用列索引(从 1 开始):如
rs.getString(1)、rs.getInt(2)—— 效率略高,但易出错,尤其 SQL 中有SELECT *或字段顺序变动时 - 注意类型匹配:数据库类型要与
getXXX()方法对应(如TINYINT通常用getByte()或getInt()),避免SQLException
及时关闭 ResultSet、Statement 和 Connection
ResultSet 是数据库连接上的活跃资源,不关闭会导致连接泄漏、内存占用升高甚至数据库连接池耗尽:
- 务必在
finally块或 try-with-resources 中关闭:rs.close()、stmt.close()、conn.close() - 推荐使用 try-with-resources(JDK 7+),自动按声明逆序关闭:
try (Connection conn = dataSource.getConnection();
PreparedStatement stmt = conn.prepareStatement("SELECT id, name FROM user");
ResultSet rs = stmt.executeQuery()) {
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
System.out.println(id + ": " + name);
}
} catch (SQLException e) {
e.printStackTrace();
}注意可滚动和并发类型的限制
默认 ResultSet 是 TYPE_FORWARD_ONLY 且 CONCUR_READ_ONLY,意味着:
- 只能单向遍历(不能
previous()、first()、last()) - 不能更新数据(调用
updateXXX()会抛异常) - 如需可滚动,创建 Statement 时指定:
conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY) - 但要注意:可滚动结果集可能带来额外开销,且并非所有驱动都完全支持
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











