JDBC 通过 ResultSet 游标遍历查询结果,需调用 next() 移动至首行并判断数据存在性;推荐用列名取值、匹配字段类型、检查 NULL;必须及时关闭 ResultSet,建议用 try-with-resources;动态场景可借助 ResultSetMetaData 或专用方法处理大对象与滚动需求。

Java 中 JDBC 处理数据库查询结果集,核心是使用 ResultSet 接口配合游标遍历,逐行读取并映射数据。关键不在于“一次全取”,而在于“按需流式获取”,既节省内存,又符合 JDBC 设计初衷。
用 next() 遍历每一行
ResultSet 的游标初始位于第一行之前,必须调用 next() 才能移动到首行,并判断是否还有数据。这是最基础、最常用的遍历方式:
- 每次调用
rs.next()返回true表示成功移到下一行,可安全读取;返回false表示已到末尾 - 不能跳过
next()直接调用getString("name"),否则会抛SQLException - 典型结构是
while (rs.next()) { ... },内部再取字段值
用列名或列索引取值
获取当前行某列数据时,推荐优先使用列名(如 rs.getString("email")),语义清晰、不易出错;列索引(如 rs.getString(2))适合列顺序固定且已知的场景:
- 列名方式更健壮:SQL 中调整 SELECT 字段顺序不影响 Java 代码
- 列索引从 1 开始(不是 0),索引越界会报异常
- 类型方法要匹配字段实际类型,例如
getInt()对应 INT 列,getTimestamp()对应 DATETIME - 若字段可能为 NULL,建议用
wasNull()检查,避免误判 0 或空字符串
及时关闭 ResultSet 资源
ResultSet 是数据库连接持有的有状态资源,不关闭会导致连接泄漏、内存堆积甚至数据库连接数耗尽:
立即学习“Java免费学习笔记(深入)”;
- 应在
finally块或 try-with-resources 中显式关闭,顺序通常是:ResultSet → Statement → Connection - 现代写法推荐用 try-with-resources,自动释放(JDK 7+):
try (ResultSet rs = stmt.executeQuery(sql)) { ... } - 即使只查一条记录,也要走完整遍历流程,不能省略
next()和close()
需要时获取元数据或处理特殊类型
如果 SQL 动态、字段未知,或涉及 BLOB、CLOB 等大对象,可借助 ResultSetMetaData 或专用方法:
- 调用
rs.getMetaData().getColumnCount()和getColumnLabel(i)获取列数和列名,实现通用映射 - 读取图片、文件等二进制内容,用
rs.getBinaryStream("photo")或rs.getBlob("data") - 若需滚动(如倒序、跳转),创建 Statement 时指定
TYPE_SCROLL_INSENSITIVE类型


















