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()方法-