
# 处理结果集
#### 设置结果集类型
不同类型的结果集有各自的应用场景，应用程序需要根据实际情况选择相应的结果集类型。在执行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.TYPE_SCROLL_SENSITIVE，也不会看到由其他事务在这之后引起的改变。调用ResultSet的refreshRow()方法，可进入数据库并从其中取得当前游标所指记录的最新数据。 |
| resultSetConcurrency | 表示结果集的并发，具体有两种类型： - ResultSet.CONCUR_READ_ONLY：如果不从结果集中的数据建立一个新的更新语句，不能对结果集中的数据进行更新。  - ResultSet.CONCUR_UPDATEABLE：可改变的结果集。对于可滚动的结果集，可对结果集进行适当的改变。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
   
#### 在结果集中定位
ResultSet对象具有指向其当前数据行的光标。最初，光标被置于第一行之前，next方法将光标移动到下一行。因为该方法在ResultSet对象没有下一行时返回false，所以可以在while循环中使用它来迭代结果集。但对于可滚动的结果集，JDBC驱动程序提供更多的定位方法，使ResultSet指向特定的行。定位方法如[表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()       | 是否在第一行。    |
| isLast()        | 是否在最后一行。   |
| isBeforeFirst() | 是否在第一行之前。  |
| isAfterLast()   | 是否在最后一行之后。 |
| getRow()        | 获取当前在第几行。  |
   
#### 获取结果集中的数据
ResultSet对象提供了丰富的方法，以获取结果集中的数据。获取数据常用的方法如[表4]所示，其他方法请参考JDK官方文档。
 表4ResultSet对象的常用方法 
| 方法                            | 描述              |
|:---|:---|
| getInt(int columnIndex)       | 按列标获取int型数据。    |
| getInt(String columnLabel)    | 按列名获取int型数据。    |
| getString(int columnIndex)    | 按列标获取String型数据。 |
| getString(String columnLabel) | 按列名获取String型数据。 |
| getDate(int columnIndex)      | 按列标获取Date型数据。   |
| getDate(String columnLabel)   | 按列名获取Date型数据。   |
   
