# 使用 RowSet 对象

> 原文： [https://docs.oracle.com/javase/tutorial/jdbc/basics/rowset.html](https://docs.oracle.com/javase/tutorial/jdbc/basics/rowset.html)

JDBC `RowSet`对象以某种方式保存表格数据，使其比结果集更灵活，更易于使用。

Oracle 为`RowSet`的一些更常用的用途定义了五个`RowSet`接口，这些`RowSet`接口可以使用标准参考。在本教程中，您将学习如何使用这些参考实现。

这些版本的`RowSet`接口及其实现是为了方便程序员而提供的。程序员可以自由编写自己的`javax.sql.RowSet`接口版本，扩展五个`RowSet`接口的实现，或编写自己的实现。但是，许多程序员可能会发现标准参考实现已经满足他们的需求并将按原样使用它们。

本节向您介绍`RowSet`接口以及扩展此接口的以下接口：

*   `JdbcRowSet`
*   `CachedRowSet`
*   `WebRowSet`
*   `JoinRowSet`
*   `FilteredRowSet`

涵盖以下主题：

*   [RowSet 对象可以做什么？](#what_can_rowset_objects_do)
*   [各种 RowSet 对象](#kinds_of_rowset_objects)

所有`RowSet`对象都来自`ResultSet`接口，因此共享其功能。 JDBC `RowSet`对象的特殊之处在于它们添加了以下新功能：

*   [作为 JavaBeans 组件](#javabeans)的功能
*   [添加可滚动性或可更新性](#scrollability)

### 的功能

所有`RowSet`对象都是 JavaBeans 组件。这意味着他们有以下内容：

*   属性
*   JavaBeans 通知机制

#### 属性

所有`RowSet`对象都具有属性。属性是具有相应的 getter 和 setter 方法的字段。属性暴露给构建器工具（例如 IDE JDveloper 和 Eclipse 附带的那些工具），使您可以直观地操作 bean。有关更多信息，请参阅 [JavaBeans](../../javabeans/) 跟踪中的[属性](../../javabeans/writing/properties.html)课程。

#### JavaBeans 通知机制

`RowSet`对象使用 JavaBeans 事件模型，其中在发生某些事件时通知已注册的组件。对于所有`RowSet`对象，三个事件触发通知：

*   光标移动
*   更新，插入或删除行
*   更改整个`RowSet`内容

事件通知发送给所有 _ 侦听器 _，这些组件已经实现了`RowSetListener`接口，并且已经将自己添加到`RowSet`对象的组件列表中，以便在发生三个事件中的任何一个时通知。

监听器可以是 GUI 组件，例如条形图。如果条形图正在跟踪`RowSet`对象中的数据，则只要数据发生更改，侦听器就会想知道新的数据值。因此，侦听器将实现`RowSetListener`方法来定义特定事件发生时将执行的操作。然后，必须将侦听器添加到`RowSet`对象的侦听器列表中。以下代码行将条形图组件`bg`与`RowSet`对象`rs`一起注册。

```
rs.addListener(bg);

```

现在每次光标移动，更改行或全部`rs`获取新数据时，都会通知`bg`。

某些 DBMS 不支持可滚动（可滚动）的结果集，有些 DBMS 不支持可更新（可更新）的结果集。如果该 DBMS 的驱动程序未添加滚动或更新结果集的功能，则可以使用`RowSet`对象执行此操作。默认情况下，`RowSet`对象是可滚动和可更新的，因此通过使用结果集的内容填充`RowSet`对象，可以有效地使结果集可滚动和可更新。

`RowSet`对象被视为已连接或已断开连接。 _ 连接的 _ `RowSet`对象使用 JDBC 驱动程序建立与关系数据库的连接，并在整个生命周期内保持该连接。 _ 断开 _ `RowSet`对象与数据源的连接仅用于从`ResultSet`对象读取数据或将数据写回数据源。从数据源读取数据或向其数据源写入数据后，`RowSet`对象与其断开连接，从而变为“断开连接”。在其生命周期的大部分时间内，断开连接的`RowSet`对象与其数据源无关，并且独立运行。接下来的两个部分告诉您连接或断开连接意味着`RowSet`对象可以做什么。

### 连接的 RowSet 对象

只有一个标准`RowSet`实现是连接的`RowSet`对象：`JdbcRowSet`。始终连接到数据库时，`JdbcRowSet`对象与`ResultSet`对象最相似，并且通常用作包装器，以使不可滚动且只读的`ResultSet`对象可滚动和可更新。

作为 JavaBeans 组件，可以使用`JdbcRowSet`对象，例如，在 GUI 工具中选择 JDBC 驱动程序。 `JdbcRowSet`对象可以这种方式使用，因为它实际上是获取与数据库连接的驱动程序的包装器。

### 断开的 RowSet 对象

其他四个实现是断开连接的`RowSet`实现。断开连接的`RowSet`对象具有连接的`RowSet`对象的所有功能，并且它们具有仅对断开的`RowSet`对象可用的附加功能。例如，不必维护与数据源的连接使得断开连接的`RowSet`对象比`JdbcRowSet`对象或`ResultSet`对象轻得多。断开连接的`RowSet`对象也是可序列化的，并且可串行化和轻量级的组合使它们成为通过网络发送数据的理想选择。它们甚至可以用于向瘦客户端（如 PDA 和移动电话）发送数据。

`CachedRowSet`接口定义了所有已断开连接的`RowSet`对象可用的基本功能。其他三个是`CachedRowSet`接口的扩展，提供更多专业功能。以下信息显示了它们的相关性：

`CachedRowSet`对象具有`JdbcRowSet`对象的所有功能，并且还可以执行以下操作：

*   获取与数据源的连接并执行查询
*   从生成的`ResultSet`对象中读取数据并使用该数据填充自身
*   在数据断开连接时处理数据并对数据进行更改
*   重新连接到数据源以将更改写回它
*   检查与数据源的冲突并解决这些冲突

`WebRowSet`对象具有`CachedRowSet`对象的所有功能，并且还可以执行以下操作：

*   将自己写为 XML 文档
*   阅读描述`WebRowSet`对象的 XML 文档

`JoinRowSet`对象具有`WebRowSet`对象的所有功能（因此也是`CachedRowSet`对象的功能），它还可以执行以下操作：

*   形成相当于`SQL JOIN`而无需连接到数据源

`FilteredRowSet`对象同样具有`WebRowSet`对象的所有功能（因此也是`CachedRowSet`对象），还可以执行以下操作：

*   应用过滤条件，以便只显示选定的数据。这相当于在`RowSet`对象上执行查询，而无需使用查询语言或连接到数据源。