更新时间:2026-07-28 GMT+08:00
分享

处理结果集

执行SQL语句后,需要对结果集进行处理。本章节主要涵盖以下内容:设置结果集类型、在结果集中定位、获取结果集光标位置、获取结果集数据以及示例步骤。

设置结果集类型

不同类型的结果集具有不同的应用场景,应用程序需要根据实际情况选择合适的结果集类型。在执行SQL语句时,应先创建相应的语句对象,其中部分创建方法支持设置结果集类型。java.sql.Connection接口提供了三种方法,创建语句对象且支持设置结果集类型,如下所示:

1
2
3
4
5
6
7
8
//创建一个Statement对象,该对象将生成具有给定类型和并发性的ResultSet对象。
createStatement(int resultSetType, int resultSetConcurrency);

//创建一个PreparedStatement对象,该对象将生成具有给定类型和并发性的ResultSet对象。
prepareStatement(String sql, int resultSetType, int resultSetConcurrency);

//创建一个CallableStatement对象,该对象将生成具有给定类型和并发性的ResultSet对象。
prepareCall(String sql, int resultSetType, int resultSetConcurrency);
表1 结果集类型

参数

描述

resultSetType

表示结果集的类型,有以下三种:

  • ResultSet.TYPE_FORWARD_ONLY(默认值):表示ResultSet光标只能向前移动。
  • ResultSet.TYPE_SCROLL_SENSITIVE:修改后光标重新滚动到修改所在行,可以看到修改后的结果。
  • ResultSet.TYPE_SCROLL_INSENSITIVE:修改后光标重新滚动到修改所在行,不能看到修改后的结果。
说明:

ResultSet对象从数据库中获取了数据之后,即使类型是ResultSet.TYPE_SCROLL_SENSITIVE,也不会看到由其他事务在这之后引起的改变。调用ResultSet的refreshRow()方法,可获取当前光标所指的最新数据。

resultSetConcurrency

表示结果集的并发,有以下两种:

  • ResultSet.CONCUR_READ_ONLY(默认值):只读结果集,不能直接通过结果集修改数据。
  • ResultSet.CONCUR_UPDATEABLE:可改变的结果集。对于可滚动的结果集,可对结果集进行适当的改变。

在结果集中定位

ResultSet对象包含一个指向当前数据行的光标,初始状态位于结果集第一行之前。调用next()方法将光标移动至下一行,当已无下一行时,该方法返回false,因此可将其用于while循环中迭代结果集。对于可滚动结果集,JDBC驱动程序提供特定的定位方式,支持将光标移动至任意指定行。定位方法如表2所示。

表2 在结果集中定位的方法

方法

描述

next()

把ResultSet光标向下移动一行。

previous()

把ResultSet光标向上移动一行。

beforeFirst()

把ResultSet光标定位到第一行之前。

afterLast()

把ResultSet光标定位到最后一行之后。

first()

把ResultSet光标定位到第一行。

last()

把ResultSet光标定位到最后一行。

absolute(int row)

把ResultSet光标移动到参数指定的行数。

relative(int rows)

rows为正数表示把ResultSet光标向下移动rows行,rows为负数表示把ResultSet光标向上移动(-rows)行。

获取结果集光标位置

对于可滚动的结果集,可调用定位方法来改变光标的位置。JDBC驱动程序提供了获取光标所在行的方法,如表3所示。

表3 获取结果集光标位置

方法

描述

isFirst()

ResultSet光标是否在第一行。

isLast()

ResultSet光标是否在最后一行。

isBeforeFirst()

ResultSet光标是否在第一行之前。

isAfterLast()

ResultSet光标是否在最后一行之后。

getRow()

获取ResultSet光标当前在第几行。

获取结果集数据

ResultSet对象提供了丰富的方法,以获取结果集中的数据。获取数据的常用方法如表4所示,其他方法请参见JDK官方文档。

表4 获取结果集数据的常用方法

方法

描述

getInt(int columnIndex)

按列索引获取int型数据。

getInt(String columnLabel)

按列名获取int型数据。

getString(int columnIndex)

按列索引获取String型数据。

getString(String columnLabel)

按列名获取String型数据。

getDate(int columnIndex)

按列索引获取Date型数据。

getDate(String columnLabel)

按列名获取Date型数据。

示例步骤

执行查询语句后,对返回的结果集进行处理。

  1. 使用while循环和next()方法逐行遍历结果集。

    while (rs.next()) {
        // 使用列索引获取值
        int c_customer_sk = rs.getInt(1);       // 获取第一列的int型数据
        String c_customer_name = rs.getString(2);      // 获取第二列的String型数据
        System.out.println("c_customer_sk: " + c_customer_sk + ", c_customer_name: " + c_customer_name);
    }

  2. 调用close()方法关闭资源。

    1
    2
    rs.close();    // 关闭ResultSet对象
    stmts.close();    // 关闭Statement对象
    

相关文档