java中处理resultset的核心是逐行遍历加按列取值:先调用next()移动游标并判断是否有数据,再用getstring()等类型安全方法按列名或序号取值,注意null处理,最后用try-with-resources及时关闭资源。

Java 中处理 JDBC 查询结果集(ResultSet)的核心是:**逐行遍历 + 按列取值**,关键在于正确使用 next() 移动游标,并通过类型安全的方法(如 getString()、getInt())获取字段值。
1. 先调用 next() 判断并移动到下一行
ResultSet 初始化时游标在第一行之前,必须先调用 next() 才能访问数据。它返回 true 表示有下一行,false 表示已到末尾。
- 不能跳过
next()直接调用getString(1),否则会抛SQLException - 常用写法是
while (rs.next()) { ... }遍历所有行 - 如果只查一条记录,可用
if (rs.next()) { ... }
2. 按列名或列序号获取字段值
推荐优先使用列名(更可读、不依赖 SQL 字段顺序),也可用序号(从 1 开始,不是 0):
-
rs.getString("username")或rs.getString(1) - 对应数据库类型的 getter 方法要匹配:如
getInt()用于整数,getDate()用于日期 - 若字段可能为
NULL,getString()返回null,getInt()返回0(注意空值陷阱!) - 安全做法:先用
wasNull()判断上一次取值是否为 SQLNULL,例如:Integer age = rs.getInt("age"); if (rs.wasNull()) age = null;
3. 处理完及时关闭资源
ResultSet、Statement(或 PreparedStatement)、Connection 都需显式关闭,避免连接泄漏:
- 使用 try-with-resources 最安全(JDK 7+):
try (Connection conn = ds.getConnection();<br> PreparedStatement ps = conn.prepareStatement(sql);<br> ResultSet rs = ps.executeQuery()) {<br> // 处理 rs<br>} - 手动关闭时,按
rs → stmt → conn逆序关闭,且每个都判空 + try-catch
4. 注意 ResultSet 的类型和并发性
默认 ResultSet 是只读、向前滚动的(TYPE_FORWARD_ONLY),意味着:
- 不能调用
previous()、first()、last()等方法 - 如需滚动或更新,创建 Statement 时指定参数:
conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY) - 但多数业务场景只需简单遍历,保持默认即可,性能更好
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











