2025/11/24
ResultSet 是 Java JDBC(Java Database Connectivity) 中的核心接口,用于表示从数据库查询(SELECT 语句)返回的结果集(表格形式的数据)。它由数据库驱动实现,封装了查询结果的行、列数据,并提供了一套方法来遍历、读取和操作这些数据。
简单来说:执行 Statement/PreparedStatement 的 executeQuery() 方法后,会返回一个 ResultSet 对象,你可以通过这个对象逐行读取查询结果中的数据。
- 基本行为:游标(Cursor)
ResultSet 依赖游标(类似指针)来定位当前行,默认行为:
初始时,游标指向第一行之前;
通过 next() 方法移动游标到下一行(返回 boolean:有数据行返回 true,无则 false);
默认游标只能向前移动(可通过参数配置为可滚动、可更新)。 - 常用配置(创建 Statement 时指定)
创建 Statement 时可指定 ResultSet 的类型和并发模式,控制其行为:
参数类型 可选值(核心) 说明
结果集类型 TYPE_FORWARD_ONLY 仅向前滚动(默认)
TYPE_SCROLL_INSENSITIVE 可滚动,对数据库修改不敏感(结果集是快照)
TYPE_SCROLL_SENSITIVE 可滚动,对数据库修改敏感(实时反映数据变化)
并发模式 CONCUR_READ_ONLY 只读(默认),无法通过 ResultSet 修改数据库
CONCUR_UPDATABLE 可更新,支持通过 ResultSet 插入 / 修改 / 删除数据库行
示例:
java
运行
// 创建可滚动、可更新的 Statement
Statement stmt = conn.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPDATABLE
); - 核心方法
(1)游标控制方法
方法 作用
boolean next() 游标下移一行,返回是否有数据行(最常用)
boolean previous() 游标上移一行(仅可滚动结果集可用)
void first() 游标移到第一行(仅可滚动)
void last() 游标移到最后一行(仅可滚动)
void beforeFirst() 游标移到第一行之前(重置)
void afterLast() 游标移到最后一行之后
int getRow() 返回当前游标所在的行号(从 1 开始)
(2)读取列数据方法
按列索引(从 1 开始)或列名读取,支持所有基本数据类型和 SQL 类型:
方法示例 说明
String getString(int columnIndex) 读取指定列索引的字符串
String getString(String columnLabel) 读取指定列名的字符串
int getInt(int idx) 读取整数
long getLong(int idx) 读取长整数
Date getDate(int idx) 读取日期(java.sql.Date)
Object getObject(int idx) 读取任意类型(通用)
注意:列索引从 1 开始(而非 0),列名区分大小写(取决于数据库)。
(3)更新 / 修改方法(仅可更新结果集)
方法示例 作用
void updateString(int idx, String value) 更新当前行指定列的值(仅内存)
void updateRow() 将内存中的修改同步到数据库
void deleteRow() 删除当前行(同步到数据库)
void moveToInsertRow() 移动游标到插入行(用于新增数据)
void insertRow() 将插入行的数据插入数据库
(4)关闭方法
java
运行
rs.close(); // 关闭 ResultSet,释放资源(必须执行,避免内存泄漏)
完整使用示例
java
运行
import java.sql.*;
public class ResultSetDemo {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/test_db";
String user = "root";
String password = "123456";
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
// 1. 加载驱动(MySQL 8.0+ 可省略)
Class.forName("com.mysql.cj.jdbc.Driver");
// 2. 获取连接
conn = DriverManager.getConnection(url, user, password);
// 3. 准备 SQL
String sql = "SELECT id, name, age FROM user WHERE age > ?";
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, 18); // 设置参数
// 4. 执行查询,获取 ResultSet
rs = pstmt.executeQuery();
// 5. 遍历结果集
while (rs.next()) {
int id = rs.getInt("id"); // 按列名读取
String name = rs.getString(2); // 按列索引读取(第2列)
int age = rs.getInt(3);
System.out.println("id: " + id + ", name: " + name + ", age: " + age);
}
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
} finally {
// 6. 关闭资源(逆序关闭)
try {
if (rs != null) rs.close();
if (pstmt != null) pstmt.close();
if (conn != null) conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
注意事项
资源释放:ResultSet 必须关闭,且关闭顺序为 ResultSet → Statement → Connection;
游标生命周期:Statement 关闭后,对应的 ResultSet 会自动关闭;
数据类型匹配:读取数据时需与数据库列类型匹配(如 INT 列用 getInt()),否则可能抛出异常;
性能:默认 TYPE_FORWARD_ONLY 性能最优,可滚动结果集性能较低,仅在必要时使用;
空值处理:若列值为 NULL,getXxx() 会返回对应类型的默认值(如 getString() 返回 null,getInt() 返回 0),可通过 wasNull() 判断是否为 NULL:
java
运行
int age = rs.getInt("age");
if (rs.wasNull()) {
System.out.println("age 为 NULL");
}
总结
ResultSet 是 JDBC 中承载查询结果的核心接口,核心能力是:
遍历行数据(通过游标);
读取列数据(按索引 / 列名);
可选:滚动游标、更新数据库数据;
使用时需注意资源释放和数据类型匹配,是 Java 操作数据库查询结果的核心工具。
浙公网安备 33010602011771号