JDBC - 结果集



读取数据库查询数据的 SQL 语句将数据返回到结果集中。SELECT 语句是从数据库中选择行并将其显示在结果集中的标准方法。java.sql.ResultSet 接口表示数据库查询的结果集。

ResultSet 对象维护一个指向结果集中当前行的游标。术语“结果集”指的是 ResultSet 对象中包含的行和列数据。

ResultSet 接口的方法可以分为三类:

  • 导航方法 - 用于在结果集中移动游标。

  • 获取方法 - 用于查看游标指向的当前行中列的数据。

  • 更新方法 - 用于更新当前行中列的数据。这些更新也可以更新到底层数据库中。

游标是根据 ResultSet 的属性可移动的。这些属性在创建生成 ResultSet 的相应 Statement 时指定。

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 接口中包含多个涉及移动游标的方法,包括:

序号 方法及描述
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

将游标移动到指定的行。

6 public boolean relative(int row) throws SQLException

从游标当前指向的位置向前或向后移动给定行数。

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

序号 方法及描述
1 public int getInt(String columnName) throws SQLException

返回 columnName 指定的列中当前行中的 int 值。

2 public int getInt(int columnIndex) throws SQLException

返回指定列索引中当前行中的 int 值。列索引从 1 开始,这意味着行的第一列为 1,行的第二列为 2,依此类推。

类似地,ResultSet 接口中为八种 Java 基本数据类型以及常见的类型(如 java.lang.String、java.lang.Object 和 java.net.URL)提供了 get 方法。

还有一些用于获取 SQL 数据类型 java.sql.Date、java.sql.Time、java.sql.TimeStamp、java.sql.Clob 和 java.sql.Blob 的方法。请查看文档以获取有关使用这些 SQL 数据类型的更多信息。

为了更好地理解,让我们学习查看 - 示例代码

更新结果集

ResultSet 接口包含一组用于更新结果集数据的方法。

与 get 方法一样,每种数据类型都有两个 update 方法:

  • 一个采用列名作为参数。

  • 一个采用列索引作为参数。

例如,要更新结果集当前行的 String 列,可以使用以下 updateString() 方法之一:

序号方法及描述
1public void updateString(int columnIndex, String s) throws SQLException

将指定列中的 String 值更改为 s 的值。

2 public void updateString(String columnName, String s) throws SQLException

与上一个方法类似,只是列由其名称而不是索引指定。

有八种基本数据类型以及 String、Object、URL 和 java.sql 包中的 SQL 数据类型的 update 方法。

更新结果集中的行会更改 ResultSet 对象中当前行的列,但不会更改底层数据库中的相应行。要将您对行的更改更新到数据库中,您需要调用以下方法之一。

序号 方法及描述
1 public void updateRow()

通过更新数据库中的对应行来更新当前行。

2 public void deleteRow()

从数据库中删除当前行。

3 public void refreshRow()

刷新结果集中的数据以反映数据库中的任何最新更改。

4 public void cancelRowUpdates()

取消对当前行所做的任何更新。

5 public void insertRow()

将一行插入数据库。此方法只能在游标指向插入行时调用。

为了更好地理解,让我们学习更新 - 示例代码

广告