
# 处理结果集
执行SQL语句后，需要对结果集进行处理。本章节主要涵盖以下内容：设置结果集类型、在结果集中定位、获取结果集光标位置、获取结果集数据以及示例步骤。
#### 设置结果集类型
不同类型的结果集具有不同的应用场景，应用程序需要根据实际情况选择合适的结果集类型。在执行SQL语句时，应先创建相应的语句对象，其中部分创建方法支持设置结果集类型。java.sql.Connection接口提供了三种方法，创建语句对象且支持设置结果集类型，如下所示：
```
//创建一个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型数据。    |
   
 #### 示例步骤
[执行查询语句](https://support.huaweicloud.com/distributed-devg-v10-gaussdb/gaussdb-12-0087.html#ZH-CN_TOPIC_0000002590360496__section726592914465)后，对返回的结果集进行处理。
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()方法关闭资源。 
   ```
   rs.close();    // 关闭ResultSet对象
   stmts.close();    // 关闭Statement对象
   ```
   
   
 
