JDBC - 结果集


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

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

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

  • 导航方法- 用于移动光标。

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

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

光标可以根据 ResultSet 的属性进行移动。这些属性是在创建生成 ResultSet 的相应语句时指定的。

JDBC 提供以下连接方法来创建具有所需结果集的语句 -

  • createStatement(int RSType, int RSConcurrency);

  • 准备语句(字符串SQL,int RSType,int RSConcurrency);

  • 准备调用(字符串sql,int RSType,int RSConcurrency);

第一个参数指示 ResultSet 对象的类型,第二个参数是两个 ResultSet 常量之一,用于指定结果集是只读还是可更新。

结果集类型

下面给出了可能的 RSType。如果您未指定任何 ResultSet 类型,您将自动获得 TYPE_FORWARD_ONLY 类型。

类型 描述
结果集.TYPE_FORWARD_ONLY 光标只能在结果集中向前移动。
结果集.TYPE_SCROLL_INSENSITIVE 游标可以向前和向后滚动,结果集对创建结果集后其他人对数据库所做的更改不敏感。
结果集.TYPE_SCROLL_SENSITIVE。 游标可以向前和向后滚动,结果集对创建结果集后其他人对数据库所做的更改很敏感。

结果集的并发

下面给出了可能的 RSConcurrency。如果您未指定任何并发类型,您将自动获得 CONCUR_READ_ONLY 并发类型。

并发性 描述
结果集.CONCUR_READ_ONLY 创建只读结果集。这是默认设置
结果集.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() 抛出 SQLException

将光标移动到第一行之前。

2 public void afterLast() 抛出 SQLException

将光标移动到最后一行之后。

3 public boolean first() 抛出 SQLException

将光标移至第一行。

4 public void last() 抛出 SQLException

将光标移动到最后一行。

5 public boolean Absolute(int row) 抛出 SQLException

将光标移动到指定行。

6 public booleanrelative(int row) 抛出 SQLException

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

7 public boolean previous() 抛出 SQLException

将光标移动到上一行。如果前一行不在结果集中,则此方法返回 false。

8 public boolean next() 抛出 SQLException

将光标移动到下一行。如果结果集中没有更多行,则此方法返回 false。

9 public int getRow() 抛出 SQLException

返回光标指向的行号。

10 public void moveToInsertRow() 抛出 SQLException

将游标移动到结果集中的特殊行,可用于将新行插入数据库。当前光标位置被记住。

11 public void moveToCurrentRow() 抛出 SQLException

如果光标当前位于插入行,则将光标移回当前行;否则,这个方法什么也不做

为了更好地理解,让我们研究Navigate - 示例代码

查看结果集

ResultSet 接口包含数十种获取当前行数据的方法。

每种可能的数据类型都有一个 get 方法,每个 get 方法都有两个版本 -

  • 一个接受列名的列。

  • 接受列索引的一个。

例如,如果您有兴趣查看的列包含 int,则需要使用 ResultSet 的 getInt() 方法之一 -

序列号 方法与说明
1 public int getInt(String columnName) 抛出 SQLException

返回名为columnName 的列中当前行的int。

2 public int getInt(int columnIndex) 抛出 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 方法一样,每种数据类型都有两种更新方法 -

  • 一个接受列名的列。

  • 接受列索引的一个。

例如,要更新结果集当前行的字符串列,您可以使用以下 updateString() 方法之一 -

序列号方法与说明
1public void updateString(int columnIndex, String s) 抛出 SQLException

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

2 public void updateString(String columnName, String s) 抛出 SQLException

与前面的方法类似,不同之处在于列是通过其名称而不是索引来指定的。

java.sql 包中提供了八种基本数据类型以及 String、Object、URL 和 SQL 数据类型的更新方法。

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

序列号 方法与说明
1 公共无效更新行()

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

2 公共无效删除行()

从数据库中删除当前行

3 公共无效刷新行()

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

4 公共无效取消行更新()

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

5 公共无效插入行()

将一行插入数据库。仅当光标指向插入行时才能调用此方法。

为了更好地理解,让我们研究一下更新示例代码