SQL 语句从数据库查询中获取数据,并将数据返回到结果集中。SELECT 语句是一种标准的方法,它从一个数据库中选择行记录,并显示在一个结果集中。 java.sql.ResultSet 接口表示一个数据库查询的结果集。
一个 ResultSet 对象控制一个光标指向当前行的结果集。术语“结果集”是指包含在 ResultSet 对象中的行和列的数据。
ResultSet 接口的方法可细分为三类-
- 导航方法:用于移动光标。
 - 获取方法:用于查看当前行被光标所指向的列中的数据。
 - 更新方法:用于更新当前行的列中的数据。这些更新也会更新数据库中的数据。
 
光标的移动基于 ResultSet 的属性。用相应的语句生成 ResultSet 对象时,同时生成 ResultSet 的属性。
JDBC 提供了连接方法通过下列创建语句来生成你所需的 ResultSet 对象:
- createStatement(int RSType, int RSConcurrency);
 - prepareStatement(String SQL, int RSType, int RSConcurrency);
 - prepareCall(String sql, int RSType, int RSConcurrency);
 
第一个参数表示 ResultSet 对象的类型,第二个参数是两个 ResultSet 常量之一,该常量用于判断该结果集是只读的还是可修改的。
ResultSet 的类型
可能的 RSType 如下所示。如果你不指定 ResultSet 类型,将自动获得的值是 TYPE_FORWARD_ONLY。
| 类型 | 描述 | 
|---|---|
| ResultSet.TYPE_FORWARD_ONLY | 光标只能在结果集中向前移动。 | 
| ResultSet.TYPE_SCROLL_INSENSITIVE | 光标可以向前和向后移动。当结果集创建后,其他人对数据库的操作不会影响结果集的数据。 | 
| ResultSet.TYPE_SCROLL_SENSITIVE. | 光标可以向前和向后移动。当结果集创建后,其他人对数据库的操作会影响结果集的数据。 | 
ResultSet 的并发性
RSConcurrency 的值如下所示,如果你不指定并发类型,将自动获得的值是 CONCUR_READ_ONLY。
| 并发性 | 描述 | 
|---|---|
| ResultSet.CONCUR_READ_ONLY | 创建一个只读结果集,这是默认的值。 | 
| ResultSet.CONCUR_UPDATABLE | 创建一个可修改的结果集。 | 
到目前为止我们的示例可以如下所示,可以写成初始化一个 Statement 对象来创建一个只能前进,而且只读的 ResultSet 对象-
try {
   Statement stmt = conn.createStatement(
                           ResultSet.TYPE_FORWARD_ONLY,
                           ResultSet.CONCUR_READ_ONLY);
}
catch(Exception ex) {
   ....
}
finally {
   ....
}
导航结果集
在 ResultSet 接口中包括如下几种方法涉及移动光标-
| S.N. | 方法 & 描述 | 
|---|---|
| 1 | 
public void beforeFirst() throws SQLException 
 将光标移动到第一行之前。  | 
| 2 | 
public void afterLast() throws SQLException 
 将光标移动到最后一行之后。  | 
| 3 | 
public boolean first() throws SQLException 
 将光标移动到第一行。  | 
| 4 | 
public void last() throws SQLException 
 将光标移动到最后一行。  | 
| 5 | 
public boolean absolute(int row) throws SQLException
 将光标移动到指定的第 row 行。  | 
| 6 | 
public boolean relative(int row) throws SQLException 
 将光标移动到当前指向的位置往前或往后第 row 行的位置。  | 
| 7 | 
public boolean previous() throws SQLException 
 将光标移动到上一行,如果超过结果集的范围则返回 false。  | 
| 8 | 
public boolean next() throws SQLException 
 将光标移动到下一行,如果是结果集的最后一行则返回 false。  | 
| 9 | 
public int getRow() throws SQLException 
 返回当前光标指向的行数的值。  | 
| 10 | 
public void moveToInsertRow() throws SQLException 
 将光标移动到结果集中指定的行,可以在数据库中插入新的一行。当前光标位置将被记住。  | 
| 11 | 
public void moveToCurrentRow() throws SQLException 
 如果光标处于插入行,则将光标返回到当前行,其他情况下,这个方法不执行任何操作。  | 
为了更好地理解,让我们研究学习导航示例代码。
查看结果集
ResultSet接口中含有几十种从当前行获取数据的方法。
每个可能的数据类型都有一个 get 方法,并且每个 get 方法有两个版本-
- 一个需要列名。
 - 一个需要列的索引。
 
例如,如果你想查看的列包含一个 int 类型,你需要在 ResultSet 中调用 getInt()方法-
| S.N. | 方法 & 描述 | 
|---|---|
| 1 | 
public int getInt(String columnName) throws SQLException
 返回当前行中名为 columnName 的列的 int 值。  | 
| 2 | 
public int getInt(int columnIndex) throws SQLException
 返回当前行中指定列的索引的 int 值。列索引从 1 开始,意味着行中的第一列是 1 ,第二列是 2 ,以此类推。  | 
同样的,在 ResultSet 接口中还有获取八个 Java 原始类型的 get 方法,以及常见的类型,比如 java.lang.String,java.lang.Object 和 java.net.URL。
也有用于获取 SQL 数据类型 java.sql.Date, java.sql.Time, java.sql.Timestamp, java.sql.Clob,java.sql.Blob 中的方法。查看文档可以了解使用这些 SQL 数据类型的更多的信息。
更新的结果集
ResultSet 接口包含了一系列的更新方法,该方法用于更新结果集中的数据。
用 get 方法可以有两个更新方法来更新任一数据类型-
- 一个需要列名。
 - 一个需要列的索引。
 
例如,要更新一个结果集的当前行的 String 列,你可以使用任一如下所示的 updateString()方法-