- 所有超接口:
-
AutoCloseable
,Joinable
,ResultSet
,RowSet
,Wrapper
- 所有已知子接口:
-
FilteredRowSet
,JoinRowSet
,WebRowSet
CachedRowSet
必须实现。
由Oracle Corporation提供的CachedRowSet
接口的参考实现是一个标准实现。开发人员可以直接使用这个实现,也可以扩展它,或者选择编写自己的接口实现。
CachedRowSet
对象是一个数据行的容器,它将其行缓存在内存中,这使得它可以在不始终连接到数据源的情况下运行。此外,它是一个JavaBeans组件,可滚动、可更新和可序列化。一个CachedRowSet
对象通常包含来自结果集的行,但也可以包含来自任何具有表格式的文件的行,例如电子表格。参考实现仅支持从ResultSet
对象获取数据,但开发人员可以扩展SyncProvider
实现以提供对其他表格数据源的访问。
应用程序可以修改CachedRowSet
对象中的数据,然后这些修改可以传播回数据源。
CachedRowSet
对象是一个断开连接的行集,这意味着它只在读取数据以填充自身行时短暂连接到其数据源。它在读取数据以填充自身行时连接到其数据源,以及在将更改传播回底层数据源时再次连接到其数据源。其余时间,CachedRowSet
对象是断开连接的,包括在修改数据时。断开连接使RowSet
对象更加精简,因此更容易传递给另一个组件。例如,一个断开连接的RowSet
对象可以被序列化并传递到诸如个人数字助理(PDA)之类的轻客户端。
1.0 创建CachedRowSet
对象
以下代码行使用参考实现(RI)中提供的默认构造函数来创建默认的CachedRowSet
对象。
CachedRowSetImpl crs = new CachedRowSetImpl();这个新的
CachedRowSet
对象将其属性设置为BaseRowSet
对象的默认属性,并且它将一个RIOptimisticProvider
对象作为其同步提供者。RIOptimisticProvider
,RI中包含的两个SyncProvider
实现之一,是SyncFactory
单例在未指定同步提供者时提供的默认提供者。
SyncProvider
对象为CachedRowSet
对象提供一个读取器(RowSetReader
对象),用于从数据源读取数据以填充自身数据。读取器可以实现从ResultSet
对象或具有表格式的文件中读取数据。SyncProvider
对象还提供一个写入器(RowSetWriter
对象),用于将在断开连接时对CachedRowSet
对象的数据进行的任何修改与底层数据源中的数据进行同步。
写入器可以实现对冲突进行各种程度的检查和避免。 (当数据源中的值在行集填充自身后发生更改时会发生冲突。)RIOptimisticProvider
实现假定几乎没有冲突,因此不设置任何锁。仅当没有冲突时,它才使用CachedRowSet
对象中的值更新数据源。其他写入器可以实现为始终将修改后的数据写入数据源,这可以通过不检查冲突或者在另一端设置足以防止数据源中的数据更改的锁来实现。其他写入器实现可以介于这两者之间。
CachedRowSet
对象可以使用已向SyncFactory
单例注册的任何SyncProvider
实现。应用程序可以通过调用以下代码行来查找已注册的SyncProvider
实现。
java.util.Enumeration providers = SyncFactory.getRegisteredProviders();
CachedRowSet
对象指定将使用哪个SyncProvider
对象有两种方式。
- 向构造函数提供实现的名称
以下代码行创建了使用指定SyncProvider
对象的默认值初始化的CachedRowSet
对象crs2。CachedRowSetImpl crs2 = new CachedRowSetImpl( "com.fred.providers.HighAvailabilityProvider");
- 使用
CachedRowSet
方法setSyncProvider
设置SyncProvider
以下代码行重置使用默认构造函数创建的CachedRowSet
对象crs的SyncProvider
对象。crs.setSyncProvider("com.fred.providers.HighAvailabilityProvider");
SyncFactory
和SyncProvider
的注释。
2.0 从CachedRowSet
对象检索数据
通过使用从ResultSet
接口继承的getter方法从CachedRowSet
对象中检索数据。以下示例中,其中crs
是一个CachedRowSet
对象,演示了如何遍历行,检索每行中的列值。第一个示例使用接受列号的getter方法版本;第二个示例使用接受列名的版本。当RowSet
对象的命令为SELECT * FROM TABLENAME
形式时,通常使用列号;当命令通过列名指定列时,通常使用列名。
while (crs.next()) { String name = crs.getString(1); int id = crs.getInt(2); Clob comment = crs.getClob(3); short dept = crs.getShort(4); System.out.println(name + " " + id + " " + comment + " " + dept); }
while (crs.next()) { String name = crs.getString("NAME"); int id = crs.getInt("ID"); Clob comment = crs.getClob("COM"); short dept = crs.getShort("DEPT"); System.out.println(name + " " + id + " " + comment + " " + dept); }
2.1 检索RowSetMetaData
应用程序可以通过在RowSetMetaData
对象上调用ResultSetMetaData
和RowSetMetaData
方法来获取关于CachedRowSet
对象中列的信息。以下代码片段中,其中crs是一个CachedRowSet
对象,说明了这个过程。第一行创建一个包含crs中列信息的RowSetMetaData
对象。从ResultSet
接口继承的getMetaData
方法返回一个ResultSetMetaData
对象,然后被转换为RowSetMetaData
对象并赋给变量rsmd。第二行找出jrs有多少列,第三行获取jrs
中第二列中存储的值的JDBC类型。
RowSetMetaData rsmd = (RowSetMetaData)crs.getMetaData(); int count = rsmd.getColumnCount(); int type = rsmd.getColumnType(2);
RowSetMetaData
接口与ResultSetMetaData
接口有两个不同之处。
- 它包括
setter
方法:当RowSet
对象从不同的ResultSet
对象中填充数据时,这些方法在内部使用。 - 它包含较少的
getter
方法:一些ResultSetMetaData
方法不适用于RowSet
对象。例如,检索列值是可写还是只读的方法不适用,因为RowSet
对象的所有列都将是可写或只读的,具体取决于行集是否可更新。
RowSetMetaData
对象,实现必须重写java.sql.ResultSet
中定义的getMetaData()
方法并返回一个RowSetMetaData
对象。
3.0 更新CachedRowSet
对象
更新CachedRowSet
对象类似于更新ResultSet
对象,但由于在更新时行集未连接到其数据源,因此必须执行额外的步骤来影响其底层数据源中的更改。在调用updateRow
或insertRow
方法后,CachedRowSet
对象还必须调用acceptChanges
方法才能将更新写入数据源。以下示例中,光标位于CachedRowSet
对象crs中的一行上,显示了更新当前行中两个列值并更新RowSet
对象的底层数据源所需的代码。
crs.updateShort(3, 58); crs.updateInt(4, 150000); crs.updateRow(); crs.acceptChanges();
下一个示例演示了移动到插入行,构建插入行上的新行,将其插入行集,然后调用acceptChanges方法将新行添加到底层数据源。请注意,与getter方法一样,更新器方法可以使用列索引或列名来指定要操作的列。
crs.moveToInsertRow(); crs.updateString("Name", "Shakespeare"); crs.updateInt("ID", 10098347); crs.updateShort("Age", 58); crs.updateInt("Sal", 150000); crs.insertRow(); crs.moveToCurrentRow(); crs.acceptChanges();
注意:insertRow()
方法插入CachedRowSet
对象的插入行的内容是由实现定义的。CachedRowSet
接口的参考实现将在当前行后立即插入新行,但也可以实现为在任意数量的其他位置插入新行。
关于这些示例的另一个要注意的事项是它们如何使用acceptChanges
方法。正是这个方法将CachedRowSet
对象中的更改传播回底层数据源,内部调用RowSet
对象的写入器来将更改写入数据源。为了做到这一点,写入器必须承担与该数据源建立连接的开销。前两个代码片段在调用updateRow
或insertRow
之后立即调用acceptChanges
方法。然而,当有多行被更改时,最好在所有对updateRow
和insertRow
的调用都完成后再调用acceptChanges
。如果只调用一次acceptChanges
,只需要建立一个连接。
4.0 更新底层数据源
当执行方法acceptChanges
时,CachedRowSet
对象的写入器,即 RowSetWriterImpl
对象,会在幕后被调用,将对行集所做的更改写入底层数据源。写入器被实现为连接到数据源并将更新写入其中。
通过SyncProvider
接口的实现提供了一个写入器,如第1节“创建CachedRowSet
对象”中所讨论的。默认的参考实现提供程序RIOptimisticProvider
,其写入器实现为使用一种乐观并发控制机制。也就是说,在行集与数据库断开连接时,它不会在底层数据库中维护任何锁定,只是在写入数据到数据源之前简单地检查是否存在任何冲突。如果存在任何冲突,它就不会将任何内容写入数据源。
SyncProvider
类提供的读取器/写入器功能是可插拔的,允许自定义数据检索和更新。如果需要不同的并发控制机制,可以使用setSyncProvider
方法插入不同的SyncProvider
实现。
为了使用乐观并发控制例程,RIOptimisticProvider
保持其当前值和原始值(即其紧随当前值之前的值)。请注意,如果没有对RowSet
对象中的数据进行任何更改,则其当前值和原始值相同,都是RowSet
对象最初填充时的值。然而,一旦对RowSet
对象中的任何值进行了更改,当前值和原始值将不同,尽管在此阶段,原始值仍然是初始值。对RowSet
对象中的数据进行任何后续更改后,其原始值和当前值仍将不同,但其原始值将是先前的当前值。
跟踪原始值使写入器能够将RowSet
对象的原始值与数据库中的值进行比较。如果数据库中的值与RowSet
对象的原始值不同,这意味着存在冲突。写入器是否检查冲突、检查程度以及如何处理冲突都取决于其实现方式。
5.0 注册和通知监听器
作为JavaBeans组件,所有行集都参与JavaBeans事件模型,从BaseRowSet
类继承用于注册监听器和通知它们的方法。对于CachedRowSet
对象的监听器是希望在行集发生更改时得到通知的组件。例如,如果一个CachedRowSet
对象包含查询结果,并且这些结果正在显示在表格和柱状图中,那么表格和柱状图可以注册为监听器,以便它们可以更新自身以反映更改。要成为监听器,表格和柱状图类必须实现RowSetListener
接口。然后它们可以添加到CachedRowSet
对象的监听器列表中,如下面的代码所示。
crs.addRowSetListener(table); crs.addRowSetListener(barGraph);每个
CachedRowSet
方法移动光标或更改数据时也会通知已注册的监听器进行更改,因此table
和barGraph
在crs
发生更改时将会收到通知。
6.0 将数据传递给轻量级客户端
使用CachedRowSet
对象的主要原因之一是在应用程序的不同组件之间传递数据。由于它是可序列化的,例如,可以使用CachedRowSet
对象将由运行在服务器环境中的企业JavaBeans组件执行的查询结果通过网络发送到在Web浏览器中运行的客户端。
当一个CachedRowSet
对象处于断开状态时,它可以比具有相同数据的ResultSet
对象更精简。因此,它特别适合将数据发送到轻量级客户端,例如PDA,在那里使用JDBC驱动程序由于资源限制或安全考虑而不合适。因此,CachedRowSet
对象提供了一种“获取行”的方法,而无需实现完整的JDBC API。
7.0 滚动和更新
CachedRowSet
对象的第二个主要用途是为不提供这些功能的ResultSet
对象提供滚动和更新。换句话说,当DBMS不提供完全支持滚动和更新时,可以使用CachedRowSet
对象来增强启用JDBC技术的驱动程序(以下简称“JDBC驱动程序”)的功能。为了实现使不可滚动和只读的ResultSet
对象可滚动和可更新的效果,程序员只需创建一个使用该ResultSet
对象的数据填充的CachedRowSet
对象。这在以下代码片段中进行了演示,其中stmt
是一个Statement
对象。
ResultSet rs = stmt.executeQuery("SELECT * FROM EMPLOYEES"); CachedRowSetImpl crs = new CachedRowSetImpl(); crs.populate(rs);
对象crs
现在包含来自表EMPLOYEES
的数据,就像对象rs
一样。不同之处在于,crs
的光标可以向前、向后移动,或者移动到特定行,即使rs
的光标只能向前移动。此外,默认情况下,CachedRowSet
对象既可滚动又可更新,即使rs
不能。
总之,CachedRowSet
对象可以被视为简单地是一组在数据源之外被缓存的行。由于它是轻量级且可序列化的,因此可以轻松地通过网络发送,并且非常适合将数据发送到轻量级客户端。然而,CachedRowSet
对象有一个限制:它的大小受限于一次在内存中存储的数据量。
8.0 获取通用数据访问
CachedRowSet
类的另一个优点是它使得可以从关系数据库以外的源中检索和存储数据。行集的读取器可以被实现为从任何表格数据源(包括电子表格或平面文件)读取数据并填充其行集。由于可以从头开始创建CachedRowSet
对象及其元数据,因此充当行集工厂的组件可以利用此功能创建包含来自非SQL数据源的数据的行集。然而,预计大多数情况下,CachedRowSet
对象将包含使用JDBC API从SQL数据库获取的数据。
9.0 设置属性
所有行集都维护一组属性,通常会使用工具设置这些属性。行集具有的属性数量和类型将因行集的功能和数据获取方式而异。例如,从ResultSet
对象获取数据的行集需要设置用于建立数据库连接的属性。如果行集使用DriverManager
工具来建立连接,则需要设置一个用于标识适当驱动程序的JDBC URL的属性,以及设置给定用户名和密码的属性。另一方面,如果行集使用DataSource
对象来建立连接,这是首选方法,它不需要设置JDBC URL的属性。相反,它需要设置数据源的逻辑名称、用户名和密码的属性。
注意:为了使用DataSource
对象进行连接,DataSource
对象必须已经在使用Java命名和目录接口(JNDI)API的命名服务中注册。通常,这个注册是由扮演系统管理员角色的人员完成的。
为了能够从数据库中填充自身的数据,行集需要设置一个命令属性。该属性是一个PreparedStatement
对象的查询,允许查询在运行时具有参数占位符,而不是设计时。为了使用值设置这些占位符参数,行集提供了一组setter方法,用于设置每种数据类型的值,类似于PreparedStatement
接口提供的setter方法。
以下代码片段说明了CachedRowSet
对象crs
如何设置其命令属性。请注意,如果使用工具设置属性,则这是工具将使用的代码。
crs.setCommand("SELECT FIRST_NAME, LAST_NAME, ADDRESS FROM CUSTOMERS " +
"WHERE CREDIT_LIMIT > ? AND REGION = ?");
将用于设置命令的占位符参数的值包含在RowSet
对象的params
字段中,这是一个Vector
对象。CachedRowSet
类提供了一组setter方法,用于设置其params
字段中的元素。以下代码片段演示了如何设置前面示例中查询中的两个参数。
crs.setInt(1, 5000); crs.setString(2, "West");
params
字段现在包含两个元素,每个元素都是两个元素长的数组。第一个元素是参数编号;第二个是要设置的值。在这种情况下,params
的第一个元素是1
,5000
,第二个元素是2
,"West"
。当应用程序调用execute
方法时,它将依次调用此RowSet
对象的读取器,后者将依次调用其readData
方法。作为其实现的一部分,readData
将获取params
中的值,并使用它们来设置命令的占位符参数。以下代码片段展示了读取器在获取Connection
对象con
后如何执行此操作。
PreparedStatement pstmt = con.prepareStatement(crs.getCommand());
reader.decodeParams();
// decodeParams找出要使用的setter方法,并执行以下操作:
// for (i = 0; i < params.length; i++) {
// pstmt.setObject(i + 1, params[i]);
// }
此时,crs
的命令是查询"SELECT FIRST_NAME, LAST_NAME, ADDRESS FROM CUSTOMERS WHERE CREDIT_LIMIT > 5000 AND REGION = "West"
。当readData
方法执行此命令时,使用以下代码行,它将从rs
中获取数据,以填充crs
。
ResultSet rs = pstmt.executeQuery();
前面的代码片段展示了幕后发生的事情;它们不会出现在应用程序中,应用程序不会调用像readData
和decodeParams
这样的方法。相比之下,以下代码片段展示了应用程序可能会执行的操作。它设置了rowset的命令,设置了命令的参数,并执行了命令。通过调用execute
方法,crs
将从表CUSTOMERS
中填充所请求的数据。
crs.setCommand("SELECT FIRST_NAME, LAST_NAME, ADDRESS FROM CUSTOMERS" +
"WHERE CREDIT_LIMIT > ? AND REGION = ?");
crs.setInt(1, 5000);
crs.setString(2, "West");
crs.execute();
10.0 分页数据
因为CachedRowSet
对象将数据存储在内存中,它可以包含的数据量取决于可用内存量。为了避免这种限制,CachedRowSet
对象可以以数据块(称为页)的形式从ResultSet
对象中检索数据。为了利用这种机制,应用程序使用方法setPageSize
设置要包含在一页中的行数。换句话说,如果将页面大小设置为五,则会一次从数据源中获取五行数据块。应用程序还可以选择设置一次可获取的最大行数。如果将最大行数设置为零,或者未设置最大行数,则一次可获取的行数没有限制。
属性设置完成后,CachedRowSet
对象必须使用populate
方法或execute
方法填充数据。以下代码演示了使用populate
方法。请注意,此方法的这个版本接受两个参数,一个是ResultSet
句柄,另一个是从中开始检索行的ResultSet
对象中的行。
CachedRowSet crs = new CachedRowSetImpl(); crs.setMaxRows(20); crs.setPageSize(4); crs.populate(rsHandle, 10);当此代码运行时,crs将从rsHandle的第十行开始填充四行数据。
下一个代码片段展示了使用execute
方法填充CachedRowSet
对象,该方法可能需要一个Connection
对象作为参数。此代码向execute
传递了Connection
对象conHandle。
请注意,以下代码片段与前一个代码片段之间存在两个区别。首先,未调用setMaxRows
方法,因此未设置crs可能包含的行数限制。(请记住,crs始终具有存储在内存中的数据量的最大限制。)第二个区别是不能向execute
方法传递要从中开始检索行的ResultSet
对象的行号。此方法始终从第一行开始。
CachedRowSet crs = new CachedRowSetImpl(); crs.setPageSize(5); crs.execute(conHandle);运行此代码后,crs将包含由
crs
的命令生成的ResultSet
对象中的五行数据。对于crs的写入器将使用conHandle连接到数据源并执行crs
的命令。然后应用程序可以像操作任何其他CachedRowSet
对象中的数据一样操作crs中的数据。
要访问下一页(数据块),应用程序调用nextPage
方法。此方法创建一个新的CachedRowSet
对象,并用下一页的数据填充它。例如,假设CachedRowSet
对象的命令返回一个包含1000行数据的ResultSet
对象rs。如果页面大小设置为100,第一次调用nextPage
方法将创建一个包含rs的前100行的CachedRowSet
对象。在对这前100行数据进行操作后,应用程序可以再次调用nextPage
方法,以创建另一个CachedRowSet
对象,其中包含rs的第二个100行。第一个CachedRowSet
对象中的数据将不再存在于内存中,因为它被第二个CachedRowSet
对象的数据替换了。第十次调用nextPage
方法后,第十个CachedRowSet
对象将包含rs中的最后100行数据,这些数据存储在内存中。在任何给定时间,只有一个CachedRowSet
对象的数据存储在内存中。
nextPage
方法在当前页不是最后一页时返回true
,当没有更多页面时返回false
。因此,它可以在while
循环中用于检索所有页面,如下面的代码所示。
CachedRowSet crs = CachedRowSetImpl(); crs.setPageSize(100); crs.execute(conHandle); while(crs.nextPage()) { while(crs.next()) { . . . // 逐行操作(每次100行)在crs中 } }运行此代码片段后,应用程序将遍历所有1000行,但每次最多只有100行存储在内存中。
CachedRowSet
接口还定义了previousPage
方法。就像nextPage
方法类似于ResultSet
方法next
一样,previousPage
方法类似于ResultSet
方法previous
。与nextPage
方法类似,previousPage
创建一个包含设置为页面大小的行数的CachedRowSet
对象。因此,例如,previousPage
方法可以在前面的代码片段的末尾的while
循环中使用,以从最后一页向第一页后退浏览页面。previousPage
方法与nextPage
方法类似,可以在while
循环中使用,只是它返回true
只要前面还有另一页,返回false
当没有更多页面时。
通过将光标定位在每页的最后一行之后,如下面的代码片段所做的那样,previous
方法将从每页的最后一行导航到第一行。该代码也可以将光标留在每页的第一行之前,然后在while
循环中使用next
方法从第一行到最后一行导航每页。
以下代码片段假设从前一个代码片段继续,即第十个CachedRowSet
对象的光标位于最后一行。该代码将光标移动到最后一行之后,以便第一次调用previous
方法将光标放回最后一行。在浏览最后一页(CachedRowSet
对象crs)的所有行后,代码然后进入while
循环,以到达第九页,反向浏览行,到达第八页,反向浏览行,依此类推到第一页的第一行。
crs.afterLast(); while(crs.previous()) { . . . // 通过行导航,从最后到第一 { while(crs.previousPage()) { crs.afterLast(); while(crs.previous()) { . . . // 从最后一行到每页的第一行 } }
- 自 JDK 版本:
- 1.5
-
Field Summary
Modifier and TypeFieldDescriptionstatic final boolean
已弃用.因为这个字段是 final 的(它是接口的一部分),其值无法更改。Fields declared in interface java.sql.ResultSet
CLOSE_CURSORS_AT_COMMIT, CONCUR_READ_ONLY, CONCUR_UPDATABLE, FETCH_FORWARD, FETCH_REVERSE, FETCH_UNKNOWN, HOLD_CURSORS_OVER_COMMIT, TYPE_FORWARD_ONLY, TYPE_SCROLL_INSENSITIVE, TYPE_SCROLL_SENSITIVE
-
Method Summary
Modifier and TypeMethodDescriptionvoid
将对此CachedRowSet
对象所做的行更新、插入和删除更改传播到底层数据源。void
acceptChanges
(Connection con) 使用指定的Connection
对象将对此CachedRowSet
对象所做的所有行更新、插入和删除更改传播到支持它的数据源。boolean
columnUpdated
(int idx) 指示此CachedRowSet
对象当前行中指定的列是否已更新。boolean
columnUpdated
(String columnName) 指示此CachedRowSet
对象当前行中指定的列是否已更新。void
commit()
每个CachedRowSet
对象的SyncProvider
包含来自传递给其构造函数的ResultSet
或 JDBC 属性的Connection
对象。创建一个RowSet
对象,它是此CachedRowSet
对象中数据的深层副本。创建一个CachedRowSet
对象,它是此CachedRowSet
对象数据的深层副本,但与其独立。创建一个CachedRowSet
对象,它是此CachedRowSet
对象的空副本。返回一个由与此CachedRowSet
对象相同数据支持的新RowSet
对象。void
execute
(Connection conn) 使用给定的连接填充此CachedRowSet
对象的数据,以生成将从中读取数据的结果集。int[]
返回一个数组,其中包含一个或多个列号,指示在此CachedRowSet
对象中唯一标识行的列。返回一个包含此CachedRowSet
对象原始值的ResultSet
对象。返回一个仅包含此CachedRowSet
对象当前行的原始值的ResultSet
对象。int
返回CachedRowSet
对象的页面大小检索在此RowSet
对象上调用时报告的第一个警告。boolean
检索一个boolean
,指示标记为删除的行是否出现在当前行集中。检索此CachedRowSet
对象的SyncProvider
实现。返回用于创建此CachedRowSet
对象的对象(表)的标识符。boolean
nextPage()
增加CachedRowSet
的当前页。void
使用给定的ResultSet
对象从中填充此CachedRowSet
对象的数据。void
使用给定的ResultSet
对象从中填充此CachedRowSet
对象的数据。boolean
减少CachedRowSet
的当前页。void
release()
释放此CachedRowSet
对象的当前内容,并向所有已注册的侦听器发送一个rowSetChanged
事件。void
将此CachedRowSet
对象恢复到其原始值,即在最后一组更改之前的值。void
rollback()
每个CachedRowSet
对象的SyncProvider
包含来自原始ResultSet
或传递给它的 JDBC 属性的Connection
对象。void
每个CachedRowSet
对象的SyncProvider
包含来自原始ResultSet
或传递给它的 JDBC 属性的Connection
对象。void
rowSetPopulated
(RowSetEvent event, int numRows) 通知已注册的侦听器,给定的 RowSetEvent 对象中的 RowSet 对象填充了一些额外的行。void
setKeyColumns
(int[] keys) 使用给定的列号数组将此CachedRowSet
对象的keyCols
字段设置为形成此CachedRowSet
对象中行的唯一标识键的列。void
使用给定的RowSetMetaData
对象为此CachedRowSet
对象设置元数据。void
将此CachedRowSet
对象的当前行设置为原始行。void
setPageSize
(int size) 设置CachedRowSet
对象的页面大小。void
setShowDeleted
(boolean b) 将属性showDeleted
设置为给定的boolean
值,该值确定标记为删除的行是否出现在当前行集中。void
setSyncProvider
(String provider) 将此CachedRowSet
对象的SyncProvider
对象设置为指定的对象。void
setTableName
(String tabName) 将此CachedRowSet
对象派生自的表的标识符设置为给定的表名。int
size()
返回此CachedRowSet
对象中的行数。Collection
<?> 将此CachedRowSet
对象转换为一个包含所有数据的Collection
对象。Collection
<?> toCollection
(int column) 将此CachedRowSet
对象中指定的列转换为一个Collection
对象。Collection
<?> toCollection
(String column) 将此CachedRowSet
对象中指定的列转换为一个Collection
对象。void
取消当前行的删除并通知侦听器行已更改。void
如果行已插入,则立即从此CachedRowSet
对象中删除当前行,并通知侦听器行已更改。void
如果行已修改,则立即撤消最后的更新操作。Methods declared in interface javax.sql.rowset.Joinable
getMatchColumnIndexes, getMatchColumnNames, setMatchColumn, setMatchColumn, setMatchColumn, setMatchColumn, unsetMatchColumn, unsetMatchColumn, unsetMatchColumn, unsetMatchColumn
Methods declared in interface java.sql.ResultSet
absolute, afterLast, beforeFirst, cancelRowUpdates, clearWarnings, close, deleteRow, findColumn, first, getArray, getArray, getAsciiStream, getAsciiStream, getBigDecimal, getBigDecimal, getBigDecimal, getBigDecimal, getBinaryStream, getBinaryStream, getBlob, getBlob, getBoolean, getBoolean, getByte, getByte, getBytes, getBytes, getCharacterStream, getCharacterStream, getClob, getClob, getConcurrency, getCursorName, getDate, getDate, getDate, getDate, getDouble, getDouble, getFetchDirection, getFetchSize, getFloat, getFloat, getHoldability, getInt, getInt, getLong, getLong, getMetaData, getNCharacterStream, getNCharacterStream, getNClob, getNClob, getNString, getNString, getObject, getObject, getObject, getObject, getObject, getObject, getRef, getRef, getRow, getRowId, getRowId, getShort, getShort, getSQLXML, getSQLXML, getStatement, getString, getString, getTime, getTime, getTime, getTime, getTimestamp, getTimestamp, getTimestamp, getTimestamp, getType, getUnicodeStream, getUnicodeStream, getURL, getURL, getWarnings, insertRow, isAfterLast, isBeforeFirst, isClosed, isFirst, isLast, last, moveToCurrentRow, moveToInsertRow, next, previous, refreshRow, relative, rowDeleted, rowInserted, rowUpdated, setFetchDirection, setFetchSize, updateArray, updateArray, updateAsciiStream, updateAsciiStream, updateAsciiStream, updateAsciiStream, updateAsciiStream, updateAsciiStream, updateBigDecimal, updateBigDecimal, updateBinaryStream, updateBinaryStream, updateBinaryStream, updateBinaryStream, updateBinaryStream, updateBinaryStream, updateBlob, updateBlob, updateBlob, updateBlob, updateBlob, updateBlob, updateBoolean, updateBoolean, updateByte, updateByte, updateBytes, updateBytes, updateCharacterStream, updateCharacterStream, updateCharacterStream, updateCharacterStream, updateCharacterStream, updateCharacterStream, updateClob, updateClob, updateClob, updateClob, updateClob, updateClob, updateDate, updateDate, updateDouble, updateDouble, updateFloat, updateFloat, updateInt, updateInt, updateLong, updateLong, updateNCharacterStream, updateNCharacterStream, updateNCharacterStream, updateNCharacterStream, updateNClob, updateNClob, updateNClob, updateNClob, updateNClob, updateNClob, updateNString, updateNString, updateNull, updateNull, updateObject, updateObject, updateObject, updateObject, updateObject, updateObject, updateObject, updateObject, updateRef, updateRef, updateRow, updateRowId, updateRowId, updateShort, updateShort, updateSQLXML, updateSQLXML, updateString, updateString, updateTime, updateTime, updateTimestamp, updateTimestamp, wasNull
Methods declared in interface javax.sql.RowSet
addRowSetListener, clearParameters, execute, getCommand, getDataSourceName, getEscapeProcessing, getMaxFieldSize, getMaxRows, getPassword, getQueryTimeout, getTransactionIsolation, getTypeMap, getUrl, getUsername, isReadOnly, removeRowSetListener, setArray, setAsciiStream, setAsciiStream, setAsciiStream, setAsciiStream, setBigDecimal, setBigDecimal, setBinaryStream, setBinaryStream, setBinaryStream, setBinaryStream, setBlob, setBlob, setBlob, setBlob, setBlob, setBlob, setBoolean, setBoolean, setByte, setByte, setBytes, setBytes, setCharacterStream, setCharacterStream, setCharacterStream, setCharacterStream, setClob, setClob, setClob, setClob, setClob, setClob, setCommand, setConcurrency, setDataSourceName, setDate, setDate, setDate, setDate, setDouble, setDouble, setEscapeProcessing, setFloat, setFloat, setInt, setInt, setLong, setLong, setMaxFieldSize, setMaxRows, setNCharacterStream, setNCharacterStream, setNCharacterStream, setNCharacterStream, setNClob, setNClob, setNClob, setNClob, setNClob, setNClob, setNString, setNString, setNull, setNull, setNull, setNull, setObject, setObject, setObject, setObject, setObject, setObject, setPassword, setQueryTimeout, setReadOnly, setRef, setRowId, setRowId, setShort, setShort, setSQLXML, setSQLXML, setString, setString, setTime, setTime, setTime, setTime, setTimestamp, setTimestamp, setTimestamp, setTimestamp, setTransactionIsolation, setType, setTypeMap, setUrl, setURL, setUsername
Methods declared in interface java.sql.Wrapper
isWrapperFor, unwrap
-
Field Details
-
COMMIT_ON_ACCEPT_CHANGES
Deprecated.Because this field is final (it is part of an interface), its value cannot be changed.当调用acceptChanges()
时,使CachedRowSet
对象的SyncProvider
提交更改。如果设置为 false,则更改将在调用CachedRowSet
接口事务方法之一之前不会提交。- 参见:
-
-
Method Details
-
populate
使用给定的ResultSet
对象中的数据填充此CachedRowSet
对象。当应用程序连接到打开的
ResultSet
对象时,此方法可用作execute
方法的替代方法。使用populate
方法可能比使用不带参数的execute
方法的版本更有效,因为它不会打开新连接并重新执行此CachedRowSet
对象的命令。与使用需要ResultSet
对象的execute
版本相比,使用populate
方法更方便。- 参数:
-
data
- 包含要读入此CachedRowSet
对象的数据的ResultSet
对象 - 抛出:
-
SQLException
- 如果提供了空的ResultSet
对象或此CachedRowSet
对象无法检索关联的ResultSetMetaData
对象 - 参见:
-
execute
使用给定的连接填充此CachedRowSet
对象的数据,以生成将从中读取数据的结果集。此方法应关闭它创建的任何数据库连接,以确保此CachedRowSet
对象断开连接,除非它正在从其数据源读取数据或将数据写入其数据源。此
CachedRowSet
对象的读取器将使用 conn 建立与数据源的连接,以便执行行集的命令并将数据从生成的ResultSet
对象读入此CachedRowSet
对象。此方法还在填充此CachedRowSet
对象后关闭 conn。如果在已经填充实现之前调用此方法,则内容和元数据将被(重新)设置。此外,如果在调用方法
acceptChanges
之前调用此方法以提交未完成的更新,则这些更新将丢失。- 参数:
-
conn
- 一个标准的 JDBCConnection
对象,具有有效的属性 - 抛出:
-
SQLException
- 如果提供了无效的Connection
对象或在建立与数据源的连接时发生错误 - 参见:
-
acceptChanges
传播对此CachedRowSet
对象所做的行更新、插入和删除更改到底层数据源。此方法调用此
CachedRowSet
对象的写入器在后台执行工作。标准的CachedRowSet
实现应该使用SyncFactory
单例来获取提供RowSetWriter
对象(写入器)的SyncProvider
实例。写入器将尝试将在此CachedRowSet
对象中所做的更改传播回数据源。当方法
acceptChanges
成功执行时,除了将更改写入数据源外,它还会使当前行的值成为原始行的值。根据正在使用的
SyncProvider
实现的同步级别,写入器将比较原始值与数据源中的值以检查冲突。当存在冲突时,例如RIOptimisticProvider
实现会抛出SyncProviderException
并且不会将任何内容写入数据源。应用程序可以选择捕获
SyncProviderException
对象并检索其包含的SyncResolver
对象。SyncResolver
对象逐行列出冲突并在解决当前冲突时在数据源上设置锁定。此外,对于每个冲突,它提供了用于检查冲突并设置应在数据源中持久化的值的方法。在解决所有冲突后,应用程序必须再次调用acceptChanges
方法以将已解决的值写入数据源。如果数据源中的所有值已经是要持久化的值,则方法acceptChanges
不执行任何操作。某些提供程序实现可能使用锁定以确保没有冲突。在这种情况下,当调用方法
acceptChanges
时,写入器将成功将更改写入数据源。此方法可以在调用方法updateRow
、insertRow
或deleteRow
后立即调用,但更有效的做法是在所有更改完成后仅调用一次,以便只需建立一个连接。注意:
acceptChanges()
方法将确定是否将COMMIT_ON_ACCEPT_CHANGES
设置为 true。如果设置为 true,则同步中的所有更新都将提交到数据源。否则,应用程序必须根据需要显式调用commit()
或rollback()
方法。- 抛出:
-
SyncProviderException
- 如果底层同步提供程序的写入器未能将更新写回数据源 - 参见:
-
acceptChanges
使用指定的Connection
对象将此CachedRowSet
对象的所有行更新、插入和删除更改传播到支持它的数据源。另一个版本的
acceptChanges
方法不传递连接,因为它使用已在RowSet
对象内部定义的Connection
对象,该连接用于最初填充它。此方法的形式类似于不带参数的形式;但与另一种形式不同的是,此形式仅在底层数据源为 JDBC 数据源时才能使用。更新后的
Connection
属性必须由SyncProvider
使用以重置RowSetWriter
配置,以确保CachedRowSet
对象的内容正确同步。当方法
acceptChanges
成功执行时,除了将更改写入数据源外,它还会使当前行的值成为原始行的值。根据正在使用的
SyncProvider
实现的同步级别,写入器将比较原始值与数据源中的值以检查冲突。当存在冲突时,例如RIOptimisticProvider
实现会抛出SyncProviderException
并且不会将任何内容写入数据源。应用程序可以选择捕获
SyncProviderException
对象并检索其包含的SyncResolver
对象。SyncResolver
对象逐行列出冲突并在解决当前冲突时在数据源上设置锁定。此外,对于每个冲突,它提供了用于检查冲突并设置应在数据源中持久化的值的方法。在解决所有冲突后,应用程序必须再次调用acceptChanges
方法以将已解决的值写入数据源。如果数据源中的所有值已经是要持久化的值,则方法acceptChanges
不执行任何操作。某些提供程序实现可能使用锁定以确保没有冲突。在这种情况下,当调用方法
acceptChanges
时,写入器将成功将更改写入数据源。此方法可以在调用方法updateRow
、insertRow
或deleteRow
后立即调用,但更有效的做法是在所有更改完成后仅调用一次,以便只需建立一个连接。注意:
acceptChanges()
方法将确定是否将COMMIT_ON_ACCEPT_CHANGES
设置为 true。如果设置为 true,则同步中的所有更新都将提交到数据源。否则,应用程序必须根据需要显式调用commit
或rollback
方法。- 参数:
-
con
- 一个标准的 JDBCConnection
对象 - 抛出:
-
SyncProviderException
- 如果底层同步提供程序的写入器未能将更新写回数据源 - 参见:
-
restoreOriginal
将此CachedRowSet
对象恢复到其原始值,即在最后一组更改之前的值。如果行集没有更改或仅有一组更改,则原始值是填充此CachedRowSet
对象时的值;否则,原始值是当前值之前的值。调用此方法时,
CachedRowSet
实现必须确保将当前行集实例的所有更新、插入和删除替换为先前的值。此外,游标应重置为第一行,并应触发rowSetChanged
事件以通知所有已注册的侦听器。- 抛出:
-
SQLException
- 如果在将此CachedRowSet
对象的当前值回滚到其先前值时发生错误 - 参见:
-
release
释放此CachedRowSet
对象的当前内容并向所有已注册的侦听器发送rowSetChanged
事件。任何未完成的更新都将被丢弃,调用此方法后,行集不包含任何行。与底层数据源没有交互,任何行集内容、元数据和内容更新都应该是不可恢复的。此
CachedRowSet
对象应该锁定,直到其内容和相关更新完全清除,从而防止其他持有对此RowSet
对象引用的组件进行“脏”读取。此外,在所有读取此CachedRowSet
对象的组件完成其读取之前,不能释放内容。在触发rowSetChanged
事件后,此CachedRowSet
对象应该恢复正常行为。元数据,包括 JDBC 属性和同步 SPI 属性,将被保留以供将来使用。重要的是,诸如
command
属性之类的属性应与最初建立此CachedRowSet
对象的来源数据源相关。此方法清空一个行集,与
close
方法相反,后者标记整个行集为可恢复,以允许垃圾收集器回收行集的 Java VM 资源。- 抛出:
-
SQLException
- 如果刷新此CachedRowSet
对象的内容时发生错误 - 参见:
-
undoDelete
取消当前行的删除并通知监听器行已更改。调用此方法后,当前行不再标记为删除。可以在行集的生命周期中的任何时候调用此方法。此外,可以通过调整光标位置使用任何光标位置控制方法(如下)来进行多次取消行删除:
CachedRowSet.absolute
CachedRowSet.first
CachedRowSet.last
- 抛出:
-
SQLException
- 如果(1)当前行尚未删除或(2)光标位于插入行之前,第一行之后或最后一行之后 - 另请参阅:
-
undoInsert
如果当前行已插入,则立即从此CachedRowSet
对象中移除当前行,并通知监听器行已更改。可以在行集的生命周期中的任何时候调用此方法,并且假设当前行在异常限制范围内(见下文),则取消当前行的行插入。此外,可以通过调整光标位置使用任何光标位置控制方法(如下)来进行多次取消行插入:
CachedRowSet.absolute
CachedRowSet.first
CachedRowSet.last
- 抛出:
-
SQLException
- 如果(1)当前行尚未插入或(2)光标位于第一行之前,最后一行之后或插入行上 - 另请参阅:
-
undoUpdate
如果当前行已修改,则立即撤消最后的更新操作。可以在行集的生命周期中的任何时候调用此方法来撤消所有列的更新,直到所有行中的更新都已回滚到上次同步(acceptChanges
)或填充之前的状态。在执行对插入行的更新时也可以调用此方法。undoUpdate
可以在行集的生命周期中的任何时候调用;但是,在发生同步后,除非进一步修改了行集数据,否则此方法不起作用。- 抛出:
-
SQLException
- 如果光标位于此CachedRowSet
对象的第一行之前或最后一行之后 - 另请参阅:
-
columnUpdated
指示此CachedRowSet
对象当前行中的指定列是否已更新。- 参数:
-
idx
- 一个标识要检查更新的列的int
- 返回:
-
如果指定列已被更新,则返回
true
;否则返回false
- 抛出:
-
SQLException
- 如果光标位于插入行上,第一行之前或最后一行之后 - 另请参阅:
-
columnUpdated
指示此CachedRowSet
对象当前行中的指定列是否已更新。- 参数:
-
columnName
- 一个String
对象,表示要检查更新的列的名称 - 返回:
-
如果列已被更新,则返回
true
;否则返回false
- 抛出:
-
SQLException
- 如果光标位于插入行上,第一行之前或最后一行之后 - 另请参阅:
-
toCollection
将此CachedRowSet
对象转换为包含所有此CachedRowSet
对象数据的Collection
对象。由于Collection
框架的抽象性质,实现在如何表示此Collection
对象方面具有一定的灵活性。每行必须完全在通用Collection
实现或专门的Collection
实现(如TreeMap
对象或Vector
对象)中表示。在Java编程语言中,SQLNULL
列值必须表示为null
。CachedRowSet
接口的标准参考实现使用TreeMap
对象来表示行集,每行中的值包含在Vector
对象中。预计大多数实现将采用相同的方式。TreeMap
类型的集合保证映射将按升序键顺序排列,根据键类的自然顺序进行排序。每个键引用一个Vector
对象,对应于RowSet
对象的一行。因此,每个Vector
对象的大小必须与RowSet
对象中的列数完全相等。由TreeMap
集合使用的键由实现确定,该实现可以选择利用内部RowSet
表结构中已设置的一组键,这是由于RowSet
对象本身或底层SQL数据上已设置了一个键。- 返回:
-
包含此
CachedRowSet
对象中每行值的Collection
对象 - 抛出:
-
SQLException
- 如果生成集合时发生错误 - 另请参阅:
-
toCollection
将此CachedRowSet
对象中的指定列转换为Collection
对象。由于Collection
框架的抽象性质,实现在如何表示此Collection
对象方面具有一定的灵活性。每个列值应在通用Collection
实现或专门的Collection
实现(如Vector
对象)中完全表示。在Java编程语言中,SQLNULL
列值必须表示为null
。标准参考实现使用
Vector
对象来包含列值,预计大多数实现将采用相同的方式。如果使用Vector
对象,则其大小必须与此CachedRowSet
对象中的行数完全相等。- 参数:
-
column
- 一个表示要在Collection
对象中表示其值的列的int
- 返回:
-
包含此
CachedRowSet
对象中指定列中存储的值的Collection
对象 - 抛出:
-
SQLException
- 如果生成集合时发生错误或提供了无效的列标识 - 另请参阅:
-
toCollection
将此CachedRowSet
对象中的指定列转换为Collection
对象。由于Collection
框架的抽象性质,实现在如何表示此Collection
对象方面具有一定的灵活性。每个列值应在通用Collection
实现或专门的Collection
实现(如Vector
对象)中完全表示。在Java编程语言中,SQLNULL
列值必须表示为null
。标准参考实现使用
Vector
对象来包含列值,预计大多数实现将采用相同的方式。如果使用Vector
对象,则其大小必须与此CachedRowSet
对象中的行数完全相等。- 参数:
-
column
- 一个String
对象,表示要在集合中表示其值的列的名称 - 返回:
-
包含此
CachedRowSet
对象中指定列中存储的值的Collection
对象 - 抛出:
-
SQLException
- 如果生成集合时发生错误或提供了无效的列标识 - 另请参阅:
-
getSyncProvider
检索此CachedRowSet
对象的SyncProvider
实现。在内部,此方法由行集用于触发行集与数据源之间的读取或写入操作。例如,行集可能需要从SyncProvider
中获取行集读取器(RowSetReader
对象)的句柄,以允许行集被填充。RowSetReader rowsetReader = null; SyncProvider provider = SyncFactory.getInstance("javax.sql.rowset.provider.RIOptimisticProvider"); if (provider instanceof RIOptimisticProvider) { rowsetReader = provider.getRowSetReader(); }
假设 rowsetReader 是行集实现内部的私有可访问字段,当应用程序调用execute
方法时,它会调用读取器的readData
方法来填充RowSet
对象。rowsetReader.readData((RowSetInternal)this);
此外,应用程序可以使用此方法返回的
SyncProvider
对象调用返回有关SyncProvider
对象的信息的方法,包括有关供应商、版本、提供程序标识、同步等级和当前设置的锁定的信息。- 返回:
-
设置行集实例化时设置的
SyncProvider
对象,如果未设置,则返回默认提供程序 - 抛出:
-
SQLException
- 如果在返回SyncProvider
对象时发生错误 - 参见:
-
setSyncProvider
将此CachedRowSet
对象的SyncProvider
对象设置为指定的对象。此方法允许重置SyncProvider
对象。CachedRowSet
实现应始终使用可用的SyncProvider
机制进行实例化,但有时需要或必要重置SyncProvider
对象。例如,应用程序可能希望在某个时间使用默认的SyncProvider
对象,然后选择使用最近可用且更适合其需求的提供程序。重置
SyncProvider
对象会导致RowSet
对象从SyncFactory
请求新的SyncProvider
实现。这将导致重置所有先前与原始数据源的连接和关系,并且可能会显着改变断开连接的行集的同步行为。- 参数:
-
provider
- 给出SyncProvider
实现的完全限定类名的String
对象 - 抛出:
-
SQLException
- 如果尝试重置SyncProvider
实现时发生错误 - 参见:
-
size
int size()返回此CachedRowSet
对象中的行数。- 返回:
- 行集中的行数
-
setMetaData
使用给定的RowSetMetaData
对象为此CachedRowSet
对象设置元数据。当RowSetReader
对象正在读取行集的内容时,它会创建一个RowSetMetaData
对象,并使用RowSetMetaData
实现中的方法对其进行初始化。参考实现使用RowSetMetaDataImpl
类。当读取器完成读取行集内容时,将在内部调用此方法以将RowSetMetaData
对象传递给行集。- 参数:
-
md
- 包含有关此CachedRowSet
对象中列的元数据的RowSetMetaData
对象 - 抛出:
-
SQLException
- 如果向行集提供了无效的元数据
-
getOriginal
返回一个包含此CachedRowSet
对象的原始值的ResultSet
对象。ResultSet
对象的游标应位于第一行之前。此外,返回的ResultSet
对象应具有以下属性:- ResultSet.TYPE_SCROLL_INSENSITIVE
- ResultSet.CONCUR_UPDATABLE
RowSet
对象的原始值是在最后一次与底层数据源同步之前的值。如果没有进行同步,原始值将是填充RowSet
对象时的值。当应用程序调用acceptChanges
方法并且SyncProvider
对象已实现检查冲突时,将在内部调用此方法。如果存在冲突,写入器将原始值与当前在数据源中的值进行比较以检查冲突。- 返回:
-
包含此
CachedRowSet
对象的原始值的ResultSet
对象 - 抛出:
-
SQLException
- 如果生成ResultSet
对象时发生错误
-
getOriginalRow
返回一个仅包含此CachedRowSet
对象当前行的原始值的ResultSet
对象。ResultSet
对象的游标应位于第一行之前。此外,返回的ResultSet
对象应具有以下属性:- ResultSet.TYPE_SCROLL_INSENSITIVE
- ResultSet.CONCUR_UPDATABLE
- 返回:
- 行的原始结果集
- 抛出:
-
SQLException
- 如果没有当前行 - 参见:
-
setOriginalRow
将此CachedRowSet
对象中的当前行设置为原始行。此方法在当前行的任何修改值与数据源同步后内部调用。当前行必须标记为不再插入、删除或更新。
调用
setOriginalRow
是不可逆的。- 抛出:
-
SQLException
- 如果没有当前行或在重置原始行的内容时遇到错误 - 参见:
-
getTableName
返回用于创建此CachedRowSet
对象的对象(表)的标识符。此名称可以在多个场合下设置,规范对此设置的次数或标准实现是否应跟踪先前的表名没有限制。- 返回:
-
给出此
CachedRowSet
对象的数据源的表的名称的String
对象,如果未为表设置名称,则返回null
- 抛出:
-
SQLException
- 如果返回表名时发生错误 - 参见:
-
setTableName
将此CachedRowSet
对象派生自的表的标识符设置为给定的表名。写入器使用此名称确定在同步尝试期间将数据源中的值与CachedRowSet
对象的值进行比较时要使用哪个表。表标识符还指示应将来自此CachedRowSet
对象的修改值写入何处。此
CachedRowSet
对象的实现可以从RowSetMetaDataImpl
对象内部获取名称。- 参数:
-
tabName
- 一个标识此CachedRowSet
对象派生自的表的String
对象;不能为null
,但可以是空字符串 - 抛出:
-
SQLException
- 如果命名表时遇到错误或 tabName 为null
- 参见:
-
getKeyColumns
返回一个包含一个或多个列号的数组,指示构成此CachedRowSet
对象中的行的唯一标识符的列。- 返回:
-
包含指示哪些列构成此
CachedRowSet
对象中行的主键的列号或列号的数组。如果没有列代表主键,则此数组应为空。 - 抛出:
-
SQLException
- 如果此CachedRowSet
对象为空 - 参见:
-
setKeyColumns
设置此CachedRowSet
对象的keyCols
字段为给定的列号数组,该数组形成了用于唯一标识此CachedRowSet
对象中行的键。如果一个
CachedRowSet
对象成为一个JoinRowSet
对象的一部分,那么通过此方法定义的键和生成的约束将在指定为键列的列也成为匹配列时得以维护。- 参数:
-
keys
- 一个int
数组,表示形成此CachedRowSet
对象主键的列;数组中的每个元素必须大于0
且小于或等于此行集中的列数 - 抛出:
-
SQLException
- 如果给定数组中的任何数字对此行集无效 - 参见:
-
createCopy
创建一个RowSet
对象,该对象是此CachedRowSet
对象中数据的深层副本。与从createShared
调用生成的RowSet
对象相反,对原始RowSet
对象的副本所做的更新不应对原始RowSet
对象可见。此外,注册到原始RowSet
对象的任何事件监听器不应对新的RowSet
副本具有影响。此外,必须保持已建立的任何约束限制。- 返回:
-
一个新的
RowSet
对象,它是此CachedRowSet
对象的深层副本,并且完全独立于此CachedRowSet
对象 - 抛出:
-
SQLException
- 如果在生成此CachedRowSet
对象的副本时发生错误 - 参见:
-
createCopySchema
创建一个CachedRowSet
对象,它是此CachedRowSet
对象的空副本。副本不得包含任何内容,而只能表示原始CachedRowSet
对象的表结构。此外,必须在新的空CachedRowSet
对象中同样强制执行在原始CachedRowSet
对象中设置的主键或外键约束。与从createShared
方法调用生成的RowSet
对象相反,使用createCopySchema
方法对此CachedRowSet
对象的副本进行的更新不应对其可见。应用程序可以从此方法返回的
CachedRowSet
对象中形成一个WebRowSet
对象,以将RowSet
模式定义导出到XML以供将来使用。- 返回:
-
此
CachedRowSet
对象的空副本 - 抛出:
-
SQLException
- 如果在克隆此CachedRowSet
对象的结构时发生错误 - 参见:
-
createCopyNoConstraints
创建一个CachedRowSet
对象,它是此CachedRowSet
对象数据的深层副本,但是独立于它。与从createShared
方法调用生成的RowSet
对象相反,对此CachedRowSet
对象的副本所做的更新不应对其可见。此外,注册到此CachedRowSet
对象的任何事件监听器不应对新的RowSet
对象具有影响。此外,必须不维护为此CachedRowSet
对象建立的任何约束限制。- 返回:
-
一个新的
CachedRowSet
对象,它是此CachedRowSet
对象的深层副本,并且完全独立于此CachedRowSet
对象 - 抛出:
-
SQLException
- 如果在生成此CachedRowSet
对象的副本时发生错误 - 参见:
-
getRowSetWarnings
检索此RowSet
对象调用时报告的第一个警告。此RowSet
对象上的后续警告将链接到此方法返回的RowSetWarning
对象。每次读取新行时,警告链都会自动清除。不得在已关闭的RowSet对象上调用此方法;这样做将导致抛出SQLException
。- 返回:
-
第一个报告的
RowSetWarning
对象,如果没有则返回null - 抛出:
-
SQLException
- 如果在已关闭的RowSet上调用此方法 - 参见:
-
getShowDeleted
检索一个boolean
,指示标记为删除的行是否出现在当前行集中。如果返回true
,则已删除的行与当前行一起可见。如果返回false
,则行不与当前行集中的行可见。默认值为false
。由于安全考虑或更好地适应某些部署方案,标准行集实现可能选择限制此行为。这留给实现定义,并不代表标准行为。
注意:允许已删除的行保持可见会使某些标准JDBC
RowSet
实现方法的行为复杂化。但是,大多数行集用户可以简单地忽略此额外细节,因为只有非常专业的应用程序可能希望利用此功能。- 返回:
-
如果已删除的行可见,则返回
true
;否则返回false
- 抛出:
-
SQLException
- 如果行集实现无法确定标记为删除的行是否可见 - 参见:
-
setShowDeleted
将属性showDeleted
设置为给定的boolean
值,该值确定标记为删除的行是否出现在当前行集中。如果值设置为true
,则已删除的行立即与当前行集一起可见。如果值设置为false
,则已删除的行在当前行集中被设置为不可见。由于安全考虑或更好地适应某些部署方案,标准行集实现可能选择限制此行为。这留给实现定义,并不代表标准行为。
- 参数:
-
b
- 如果应显示已删除的行,则为true
; 否则为false
- 抛出:
-
SQLException
- 如果行集实现无法重置是否应显示已删除的行 - 参见:
-
commit
每个CachedRowSet
对象的SyncProvider
包含来自ResultSet
或传递给其构造函数的JDBC属性的Connection
对象。此方法包装了Connection
的提交方法,以允许灵活的自动提交或非自动提交事务控制支持。使
acceptChanges()
方法自上次提交/回滚以来执行的所有更改永久生效。仅当已禁用自动提交模式时才应使用此方法。- 抛出:
-
SQLException
- 如果发生数据库访问错误或此CachedRowSet
中的Connection
对象处于自动提交模式 - 参见:
-
rollback
每个CachedRowSet
对象的SyncProvider
包含来自原始ResultSet
或传递给它的JDBC属性的Connection
对象。撤消当前事务中所做的所有更改。仅当已禁用自动提交模式时才应使用此方法。
- 抛出:
-
SQLException
- 如果发生数据库访问错误或此CachedRowSet
中的Connection
对象处于自动提交模式。
-
rollback
每个CachedRowSet
对象的SyncProvider
包含来自原始ResultSet
或传递给它的JDBC属性的Connection
对象。将当前事务中自上次
Savepoint
事务标记以来所做的所有更改撤消。仅当已禁用自动提交模式时才应使用此方法。- 参数:
-
s
- 一个Savepoint
事务标记 - 抛出:
-
SQLException
- 如果发生数据库访问错误或此CachedRowSet
中的Connection
对象处于自动提交模式。
-
rowSetPopulated
通知已注册的侦听器,给定的RowSetEvent对象中的RowSet对象已填充了一定数量的额外行。numRows
参数确保此事件仅在每numRow
时触发一次。事件的来源可以通过方法event.getSource检索。
- 参数:
-
event
- 包含事件源为RowSet
对象的RowSetEvent
对象 -
numRows
- 在填充时,应触发CachedRowSet
填充的行数间隔;默认值为零;不能小于fetchSize
或零 - 抛出:
-
SQLException
-numRows < 0或numRows < getFetchSize()
-
populate
使用给定的ResultSet
对象中的数据填充此CachedRowSet
对象。与populate(ResultSet)
方法相关,提供了一个额外的参数,允许在ResultSet
中的起始位置开始填充CachedRowSet实例。当应用程序连接到打开的
ResultSet
对象时,可以使用此方法作为execute
方法的替代。使用populate
方法可能比使用不带参数的execute
方法的版本更有效,因为它不会打开新连接并重新执行此CachedRowSet
对象的命令。与使用需要ResultSet
对象的execute
版本相比,使用populate
方法更多是一种便利性问题。- 参数:
-
rs
- 包含要读入此CachedRowSet
对象的数据的ResultSet
对象 -
startRow
- 在ResultSet
中开始填充此CachedRowSet
记录的位置 - 抛出:
-
SQLException
- 如果提供了空ResultSet
对象或此CachedRowSet
对象无法检索关联的ResultSetMetaData
对象 - 参见:
-
setPageSize
设置CachedRowSet
对象的页面大小。可以配置CachedRowSet
以以页面大小为单位的行批次填充自身。当调用populate()
或execute()
时,CachedRowSet
根据用于填充RowSet的原始SQL查询获取额外的页面。- 参数:
-
size
-CachedRowSet
的页面大小 - 抛出:
-
SQLException
- 如果设置CachedRowSet
页面大小时发生错误,或者页面大小小于0。
-
getPageSize
int getPageSize()返回CachedRowSet
对象的页面大小- 返回:
-
一个
int
页面大小
-
nextPage
增加CachedRowSet
的当前页面。这会导致CachedRowSet
实现获取下一个页面大小的行并填充RowSet,如果剩余的行仍在原始SQL查询的范围内。- 返回:
- 如果存在更多页面,则为true;如果这是最后一页,则为false
- 抛出:
-
SQLException
- 如果获取下一页时发生错误,或者在填充或执行之前过早调用此方法。
-
previousPage
减少CachedRowSet
的当前页面。这会导致CachedRowSet
实现获取上一个页面大小的行并填充RowSet。返回的前一页中的行数必须始终保持在用于填充RowSet的原始SQL查询的范围内。- 返回:
- 如果成功检索上一页,则为true;如果这是第一页,则为false。
- 抛出:
-
SQLException
- 如果获取上一页时发生错误,或者在填充或执行之前过早调用此方法。
-