resultset遍历必须先调用next(),推荐while(rs.next())安全遍历;按别名取值并注意大小写;按字段类型精准调用getxxx方法,配合wasnull()处理null;务必用try-with-resources自动关闭资源。

ResultSet 遍历本身不难,关键在于安全、健壮、可维护——避免空指针、类型错误、资源泄漏和只取首行等常见陷阱。
必须先调用 next() 才能读数据
ResultSet 游标初始位于第一行之前,不调用 rs.next() 就直接 getXXX() 会抛 SQLException 或返回 null。循环结构必须以 while(rs.next()) 开头,这是遍历的唯一安全入口。
- ❌ 错误写法:
rs.getString("name")直接调用(游标未移动) - ✅ 正确写法:
while (rs.next()) { String name = rs.getString("name"); ... } - 如果查询可能无结果,
if (rs.next())适合只取一行;while才用于多行
推荐按列名取值,但注意大小写与别名
用列名(如 rs.getString("email"))比用序号(rs.getString(3))更易读、抗 SQL 变更。但需注意:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- MySQL 默认不区分列名大小写,但某些数据库(如 PostgreSQL)区分,建议统一用小写定义别名
- 若 SQL 中用了别名(
SELECT u.email AS user_email),必须用 别名("user_email"),不能用原始字段名 - 列名对大小写不敏感是 JDBC 驱动行为,不是标准保证,生产环境建议显式指定别名并统一命名风格
按类型精准调用 getXXX 方法
不要全用 getString() 强转——这在字段为 NULL 或类型不匹配时易出错。应根据数据库字段类型选择对应方法:
- 数值类:用
getInt("id")、getLong("version")、getBigDecimal("amount") - 时间类:用
getTimestamp("create_time")或getObject("create_time", LocalDateTime.class)(JDBC 4.2+) - 布尔类:用
getBoolean("is_active"),避免getString().equals("1")这类脆弱逻辑 - NULL 值处理:所有 getXXX 方法对 NULL 返回对应类型的默认值(如 getInt→0,getString→null),建议配合
wasNull()判断是否真为 NULL
务必用 try-with-resources 自动关闭资源
Connection、Statement/PreparedStatement、ResultSet 都实现了 AutoCloseable。手动 close 容易遗漏或异常跳过,引发连接泄漏。
- ✅ 推荐写法:
try (Connection conn = ...; PreparedStatement ps = ...; ResultSet rs = ...) { while(rs.next()) { ... } } - ❌ 不要分开声明再 finally 关闭,尤其嵌套 try-catch 时极易出错
- 即使只查一条,也应包裹——因为 ResultSet 依赖 Statement,Statement 依赖 Connection,漏关任一都会累积资源
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










