ResultSet遍历需先调用next()移动游标(初始在第一行前),推荐while(rs.next())循环;取值可用列名(如getString("username"))或列索引(从1开始);注意NULL处理,可用wasNull()判断;资源须用try-with-resources确保关闭。

使用 ResultSet 遍历和提取查询结果,核心是调用 next() 移动游标 + 按列名或列索引获取值。关键点在于:游标初始位于第一行之前,必须先调用 next() 才能访问数据;每调用一次,游标下移一行,返回 true 表示有数据,false 表示到末尾。
基本遍历结构(推荐用 while)
最常用、最安全的方式是用 while (rs.next()) 循环,自动处理游标移动和边界判断:
-
rs.next()返回true时,当前行有效,可安全调用getXXX()方法 - 循环体内部每次处理一行数据,无需手动管理索引或计数
- 避免使用
for循环配合rs.getRow()或硬编码行数,容易出错
按列名或列索引取值(两种方式都支持)
提取字段值时,既可用数据库中定义的列名(推荐,可读性强),也可用从 1 开始的列序号(注意不是 0):
-
rs.getString("username")—— 推荐,语义清晰,与 SQL 字段名一致 -
rs.getInt("age")、rs.getDate("create_time")等,类型需与数据库字段匹配 -
rs.getString(1)、rs.getInt(2)—— 适用于动态列或别名不明确场景,但易因 SQL 改动而失效 - 列名不区分大小写(取决于 JDBC 驱动和数据库配置),但建议统一用小写或保持 SQL 中的写法
处理空值(NULL)要主动判断
数据库中的 NULL 映射为 Java 的 null(对引用类型)或默认值(如 getInt() 返回 0),不能直接依赖返回值判空:
立即学习“Java免费学习笔记(深入)”;
- 用
rs.wasNull()判断上一次getXXX()是否取到了 NULL(尤其对基本类型包装有帮助) - 更稳妥的做法是先用
rs.getObject("col") != null判断,再转型或调用对应 get 方法 - 例如:
String name = rs.getString("name"); if (rs.wasNull()) name = null;
完整示例(含资源释放)
实际使用中需确保 ResultSet、Statement、Connection 正确关闭(建议用 try-with-resources):
String sql = "SELECT id, username, email FROM users WHERE status = ?";
try (Connection conn = DriverManager.getConnection(url, user, pwd);
PreparedStatement ps = conn.prepareStatement(sql)) {
ps.setString(1, "active");
try (ResultSet rs = ps.executeQuery()) {
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("username");
String email = rs.getString("email");
System.out.printf("ID:%d, Name:%s, Email:%s%n", id, name, email);
}
}
} catch (SQLException e) {
e.printStackTrace();
}


















