2025/11/24

ResultSet 是 Java JDBC(Java Database Connectivity) 中的核心接口,用于表示从数据库查询(SELECT 语句)返回的结果集(表格形式的数据)。它由数据库驱动实现,封装了查询结果的行、列数据,并提供了一套方法来遍历、读取和操作这些数据。
简单来说:执行 Statement/PreparedStatement 的 executeQuery() 方法后,会返回一个 ResultSet 对象,你可以通过这个对象逐行读取查询结果中的数据。

  1. 基本行为:游标(Cursor)
    ResultSet 依赖游标(类似指针)来定位当前行,默认行为:
    初始时,游标指向第一行之前;
    通过 next() 方法移动游标到下一行(返回 boolean:有数据行返回 true,无则 false);
    默认游标只能向前移动(可通过参数配置为可滚动、可更新)。
  2. 常用配置(创建 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
    );
  3. 核心方法
    (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 操作数据库查询结果的核心工具。

posted on 2025-11-24 20:30  才一斤  阅读(15)  评论(0)    收藏  举报

导航