Module java.sql.rowset
Package javax.sql.rowset

Interface CachedRowSet

所有超接口:
AutoCloseable, Joinable, ResultSet, RowSet, Wrapper
所有已知子接口:
FilteredRowSet, JoinRowSet, WebRowSet

public interface CachedRowSet extends RowSet, Joinable
所有标准实现的接口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对象crsSyncProvider对象。
               crs.setSyncProvider("com.fred.providers.HighAvailabilityProvider");
          
有关更多详细信息,请参阅SyncFactorySyncProvider的注释。

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对象上调用ResultSetMetaDataRowSetMetaData方法来获取关于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对象,但由于在更新时行集未连接到其数据源,因此必须执行额外的步骤来影响其底层数据源中的更改。在调用updateRowinsertRow方法后,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对象的写入器来将更改写入数据源。为了做到这一点,写入器必须承担与该数据源建立连接的开销。前两个代码片段在调用updateRowinsertRow之后立即调用acceptChanges方法。然而,当有多行被更改时,最好在所有对updateRowinsertRow的调用都完成后再调用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方法移动光标或更改数据时也会通知已注册的监听器进行更改,因此tablebarGraphcrs发生更改时将会收到通知。

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的第一个元素是15000,第二个元素是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();
 

前面的代码片段展示了幕后发生的事情;它们不会出现在应用程序中,应用程序不会调用像readDatadecodeParams这样的方法。相比之下,以下代码片段展示了应用程序可能会执行的操作。它设置了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 Details

    • COMMIT_ON_ACCEPT_CHANGES

      @Deprecated static final boolean 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

      void populate(ResultSet data) throws SQLException
      使用给定的 ResultSet 对象中的数据填充此 CachedRowSet 对象。

      当应用程序连接到打开的 ResultSet 对象时,此方法可用作 execute 方法的替代方法。使用 populate 方法可能比使用不带参数的 execute 方法的版本更有效,因为它不会打开新连接并重新执行此 CachedRowSet 对象的命令。与使用需要 ResultSet 对象的 execute 版本相比,使用 populate 方法更方便。

      参数:
      data - 包含要读入此 CachedRowSet 对象的数据的 ResultSet 对象
      抛出:
      SQLException - 如果提供了空的 ResultSet 对象或此 CachedRowSet 对象无法检索关联的 ResultSetMetaData 对象
      参见:
    • execute

      void execute(Connection conn) throws SQLException
      使用给定的连接填充此 CachedRowSet 对象的数据,以生成将从中读取数据的结果集。此方法应关闭它创建的任何数据库连接,以确保此 CachedRowSet 对象断开连接,除非它正在从其数据源读取数据或将数据写入其数据源。

      CachedRowSet 对象的读取器将使用 conn 建立与数据源的连接,以便执行行集的命令并将数据从生成的 ResultSet 对象读入此 CachedRowSet 对象。此方法还在填充此 CachedRowSet 对象后关闭 conn

      如果在已经填充实现之前调用此方法,则内容和元数据将被(重新)设置。此外,如果在调用方法 acceptChanges 之前调用此方法以提交未完成的更新,则这些更新将丢失。

      参数:
      conn - 一个标准的 JDBC Connection 对象,具有有效的属性
      抛出:
      SQLException - 如果提供了无效的 Connection 对象或在建立与数据源的连接时发生错误
      参见:
    • acceptChanges

      void acceptChanges() throws SyncProviderException
      传播对此 CachedRowSet 对象所做的行更新、插入和删除更改到底层数据源。

      此方法调用此 CachedRowSet 对象的写入器在后台执行工作。标准的 CachedRowSet 实现应该使用 SyncFactory 单例来获取提供 RowSetWriter 对象(写入器)的 SyncProvider 实例。写入器将尝试将在此 CachedRowSet 对象中所做的更改传播回数据源。

      当方法 acceptChanges 成功执行时,除了将更改写入数据源外,它还会使当前行的值成为原始行的值。

      根据正在使用的 SyncProvider 实现的同步级别,写入器将比较原始值与数据源中的值以检查冲突。当存在冲突时,例如 RIOptimisticProvider 实现会抛出 SyncProviderException 并且不会将任何内容写入数据源。

      应用程序可以选择捕获 SyncProviderException 对象并检索其包含的 SyncResolver 对象。 SyncResolver 对象逐行列出冲突并在解决当前冲突时在数据源上设置锁定。此外,对于每个冲突,它提供了用于检查冲突并设置应在数据源中持久化的值的方法。在解决所有冲突后,应用程序必须再次调用 acceptChanges 方法以将已解决的值写入数据源。如果数据源中的所有值已经是要持久化的值,则方法 acceptChanges 不执行任何操作。

      某些提供程序实现可能使用锁定以确保没有冲突。在这种情况下,当调用方法 acceptChanges 时,写入器将成功将更改写入数据源。此方法可以在调用方法 updateRowinsertRowdeleteRow 后立即调用,但更有效的做法是在所有更改完成后仅调用一次,以便只需建立一个连接。

      注意: acceptChanges() 方法将确定是否将 COMMIT_ON_ACCEPT_CHANGES 设置为 true。如果设置为 true,则同步中的所有更新都将提交到数据源。否则,应用程序必须根据需要显式调用 commit()rollback() 方法。

      抛出:
      SyncProviderException - 如果底层同步提供程序的写入器未能将更新写回数据源
      参见:
    • acceptChanges

      void acceptChanges(Connection con) throws SyncProviderException
      使用指定的 Connection 对象将此 CachedRowSet 对象的所有行更新、插入和删除更改传播到支持它的数据源。

      另一个版本的 acceptChanges 方法不传递连接,因为它使用已在 RowSet 对象内部定义的 Connection 对象,该连接用于最初填充它。

      此方法的形式类似于不带参数的形式;但与另一种形式不同的是,此形式仅在底层数据源为 JDBC 数据源时才能使用。更新后的 Connection 属性必须由 SyncProvider 使用以重置 RowSetWriter 配置,以确保 CachedRowSet 对象的内容正确同步。

      当方法 acceptChanges 成功执行时,除了将更改写入数据源外,它还会使当前行的值成为原始行的值。

      根据正在使用的 SyncProvider 实现的同步级别,写入器将比较原始值与数据源中的值以检查冲突。当存在冲突时,例如 RIOptimisticProvider 实现会抛出 SyncProviderException 并且不会将任何内容写入数据源。

      应用程序可以选择捕获 SyncProviderException 对象并检索其包含的 SyncResolver 对象。 SyncResolver 对象逐行列出冲突并在解决当前冲突时在数据源上设置锁定。此外,对于每个冲突,它提供了用于检查冲突并设置应在数据源中持久化的值的方法。在解决所有冲突后,应用程序必须再次调用 acceptChanges 方法以将已解决的值写入数据源。如果数据源中的所有值已经是要持久化的值,则方法 acceptChanges 不执行任何操作。

      某些提供程序实现可能使用锁定以确保没有冲突。在这种情况下,当调用方法 acceptChanges 时,写入器将成功将更改写入数据源。此方法可以在调用方法 updateRowinsertRowdeleteRow 后立即调用,但更有效的做法是在所有更改完成后仅调用一次,以便只需建立一个连接。

      注意: acceptChanges() 方法将确定是否将 COMMIT_ON_ACCEPT_CHANGES 设置为 true。如果设置为 true,则同步中的所有更新都将提交到数据源。否则,应用程序必须根据需要显式调用 commitrollback 方法。

      参数:
      con - 一个标准的 JDBC Connection 对象
      抛出:
      SyncProviderException - 如果底层同步提供程序的写入器未能将更新写回数据源
      参见:
    • restoreOriginal

      void restoreOriginal() throws SQLException
      将此 CachedRowSet 对象恢复到其原始值,即在最后一组更改之前的值。如果行集没有更改或仅有一组更改,则原始值是填充此 CachedRowSet 对象时的值;否则,原始值是当前值之前的值。

      调用此方法时,CachedRowSet 实现必须确保将当前行集实例的所有更新、插入和删除替换为先前的值。此外,游标应重置为第一行,并应触发 rowSetChanged 事件以通知所有已注册的侦听器。

      抛出:
      SQLException - 如果在将此 CachedRowSet 对象的当前值回滚到其先前值时发生错误
      参见:
    • release

      void release() throws SQLException
      释放此 CachedRowSet 对象的当前内容并向所有已注册的侦听器发送 rowSetChanged 事件。任何未完成的更新都将被丢弃,调用此方法后,行集不包含任何行。与底层数据源没有交互,任何行集内容、元数据和内容更新都应该是不可恢复的。

      CachedRowSet 对象应该锁定,直到其内容和相关更新完全清除,从而防止其他持有对此 RowSet 对象引用的组件进行“脏”读取。此外,在所有读取此 CachedRowSet 对象的组件完成其读取之前,不能释放内容。在触发 rowSetChanged 事件后,此 CachedRowSet 对象应该恢复正常行为。

      元数据,包括 JDBC 属性和同步 SPI 属性,将被保留以供将来使用。重要的是,诸如 command 属性之类的属性应与最初建立此 CachedRowSet 对象的来源数据源相关。

      此方法清空一个行集,与 close 方法相反,后者标记整个行集为可恢复,以允许垃圾收集器回收行集的 Java VM 资源。

      抛出:
      SQLException - 如果刷新此 CachedRowSet 对象的内容时发生错误
      参见:
    • undoDelete

      void undoDelete() throws SQLException
      取消当前行的删除并通知监听器行已更改。调用此方法后,当前行不再标记为删除。可以在行集的生命周期中的任何时候调用此方法。

      此外,可以通过调整光标位置使用任何光标位置控制方法(如下)来进行多次取消行删除:

      • CachedRowSet.absolute
      • CachedRowSet.first
      • CachedRowSet.last
      抛出:
      SQLException - 如果(1)当前行尚未删除或(2)光标位于插入行之前,第一行之后或最后一行之后
      另请参阅:
    • undoInsert

      void undoInsert() throws SQLException
      如果当前行已插入,则立即从此CachedRowSet对象中移除当前行,并通知监听器行已更改。可以在行集的生命周期中的任何时候调用此方法,并且假设当前行在异常限制范围内(见下文),则取消当前行的行插入。

      此外,可以通过调整光标位置使用任何光标位置控制方法(如下)来进行多次取消行插入:

      • CachedRowSet.absolute
      • CachedRowSet.first
      • CachedRowSet.last
      抛出:
      SQLException - 如果(1)当前行尚未插入或(2)光标位于第一行之前,最后一行之后或插入行上
      另请参阅:
    • undoUpdate

      void undoUpdate() throws SQLException
      如果当前行已修改,则立即撤消最后的更新操作。可以在行集的生命周期中的任何时候调用此方法来撤消所有列的更新,直到所有行中的更新都已回滚到上次同步(acceptChanges)或填充之前的状态。在执行对插入行的更新时也可以调用此方法。

      undoUpdate可以在行集的生命周期中的任何时候调用;但是,在发生同步后,除非进一步修改了行集数据,否则此方法不起作用。

      抛出:
      SQLException - 如果光标位于此CachedRowSet对象的第一行之前或最后一行之后
      另请参阅:
    • columnUpdated

      boolean columnUpdated(int idx) throws SQLException
      指示此CachedRowSet对象当前行中的指定列是否已更新。
      参数:
      idx - 一个标识要检查更新的列的int
      返回:
      如果指定列已被更新,则返回true;否则返回false
      抛出:
      SQLException - 如果光标位于插入行上,第一行之前或最后一行之后
      另请参阅:
    • columnUpdated

      boolean columnUpdated(String columnName) throws SQLException
      指示此CachedRowSet对象当前行中的指定列是否已更新。
      参数:
      columnName - 一个String对象,表示要检查更新的列的名称
      返回:
      如果列已被更新,则返回true;否则返回false
      抛出:
      SQLException - 如果光标位于插入行上,第一行之前或最后一行之后
      另请参阅:
    • toCollection

      Collection<?> toCollection() throws SQLException
      将此CachedRowSet对象转换为包含所有此CachedRowSet对象数据的Collection对象。由于Collection框架的抽象性质,实现在如何表示此Collection对象方面具有一定的灵活性。每行必须完全在通用Collection实现或专门的Collection实现(如TreeMap对象或Vector对象)中表示。在Java编程语言中,SQL NULL列值必须表示为null

      CachedRowSet接口的标准参考实现使用TreeMap对象来表示行集,每行中的值包含在Vector对象中。预计大多数实现将采用相同的方式。

      TreeMap类型的集合保证映射将按升序键顺序排列,根据键类的自然顺序进行排序。每个键引用一个Vector对象,对应于RowSet对象的一行。因此,每个Vector对象的大小必须与RowSet对象中的列数完全相等。由TreeMap集合使用的键由实现确定,该实现可以选择利用内部RowSet表结构中已设置的一组键,这是由于RowSet对象本身或底层SQL数据上已设置了一个键。

      返回:
      包含此CachedRowSet对象中每行值的Collection对象
      抛出:
      SQLException - 如果生成集合时发生错误
      另请参阅:
    • toCollection

      Collection<?> toCollection(int column) throws SQLException
      将此CachedRowSet对象中的指定列转换为Collection对象。由于Collection框架的抽象性质,实现在如何表示此Collection对象方面具有一定的灵活性。每个列值应在通用Collection实现或专门的Collection实现(如Vector对象)中完全表示。在Java编程语言中,SQL NULL列值必须表示为null

      标准参考实现使用Vector对象来包含列值,预计大多数实现将采用相同的方式。如果使用Vector对象,则其大小必须与此CachedRowSet对象中的行数完全相等。

      参数:
      column - 一个表示要在Collection对象中表示其值的列的int
      返回:
      包含此CachedRowSet对象中指定列中存储的值的Collection对象
      抛出:
      SQLException - 如果生成集合时发生错误或提供了无效的列标识
      另请参阅:
    • toCollection

      Collection<?> toCollection(String column) throws SQLException
      将此CachedRowSet对象中的指定列转换为Collection对象。由于Collection框架的抽象性质,实现在如何表示此Collection对象方面具有一定的灵活性。每个列值应在通用Collection实现或专门的Collection实现(如Vector对象)中完全表示。在Java编程语言中,SQL NULL列值必须表示为null

      标准参考实现使用Vector对象来包含列值,预计大多数实现将采用相同的方式。如果使用Vector对象,则其大小必须与此CachedRowSet对象中的行数完全相等。

      参数:
      column - 一个String对象,表示要在集合中表示其值的列的名称
      返回:
      包含此CachedRowSet对象中指定列中存储的值的Collection对象
      抛出:
      SQLException - 如果生成集合时发生错误或提供了无效的列标识
      另请参阅:
    • getSyncProvider

      SyncProvider getSyncProvider() throws SQLException
      检索此 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

      void setSyncProvider(String provider) throws SQLException
      将此 CachedRowSet 对象的 SyncProvider 对象设置为指定的对象。此方法允许重置 SyncProvider 对象。

      CachedRowSet 实现应始终使用可用的 SyncProvider 机制进行实例化,但有时需要或必要重置 SyncProvider 对象。例如,应用程序可能希望在某个时间使用默认的 SyncProvider 对象,然后选择使用最近可用且更适合其需求的提供程序。

      重置 SyncProvider 对象会导致 RowSet 对象从 SyncFactory 请求新的 SyncProvider 实现。这将导致重置所有先前与原始数据源的连接和关系,并且可能会显着改变断开连接的行集的同步行为。

      参数:
      provider - 给出 SyncProvider 实现的完全限定类名的 String 对象
      抛出:
      SQLException - 如果尝试重置 SyncProvider 实现时发生错误
      参见:
    • size

      int size()
      返回此 CachedRowSet 对象中的行数。
      返回:
      行集中的行数
    • setMetaData

      void setMetaData(RowSetMetaData md) throws SQLException
      使用给定的 RowSetMetaData 对象为此 CachedRowSet 对象设置元数据。当 RowSetReader 对象正在读取行集的内容时,它会创建一个 RowSetMetaData 对象,并使用 RowSetMetaData 实现中的方法对其进行初始化。参考实现使用 RowSetMetaDataImpl 类。当读取器完成读取行集内容时,将在内部调用此方法以将 RowSetMetaData 对象传递给行集。
      参数:
      md - 包含有关此 CachedRowSet 对象中列的元数据的 RowSetMetaData 对象
      抛出:
      SQLException - 如果向行集提供了无效的元数据
    • getOriginal

      ResultSet getOriginal() throws SQLException
      返回一个包含此 CachedRowSet 对象的原始值的 ResultSet 对象。

      ResultSet 对象的游标应位于第一行之前。此外,返回的 ResultSet 对象应具有以下属性:

      • ResultSet.TYPE_SCROLL_INSENSITIVE
      • ResultSet.CONCUR_UPDATABLE

      RowSet 对象的原始值是在最后一次与底层数据源同步之前的值。如果没有进行同步,原始值将是填充 RowSet 对象时的值。当应用程序调用 acceptChanges 方法并且 SyncProvider 对象已实现检查冲突时,将在内部调用此方法。如果存在冲突,写入器将原始值与当前在数据源中的值进行比较以检查冲突。

      返回:
      包含此 CachedRowSet 对象的原始值的 ResultSet 对象
      抛出:
      SQLException - 如果生成 ResultSet 对象时发生错误
    • getOriginalRow

      ResultSet getOriginalRow() throws SQLException
      返回一个仅包含此 CachedRowSet 对象当前行的原始值的 ResultSet 对象。

      ResultSet 对象的游标应位于第一行之前。此外,返回的 ResultSet 对象应具有以下属性:

      • ResultSet.TYPE_SCROLL_INSENSITIVE
      • ResultSet.CONCUR_UPDATABLE
      返回:
      行的原始结果集
      抛出:
      SQLException - 如果没有当前行
      参见:
    • setOriginalRow

      void setOriginalRow() throws SQLException
      将此 CachedRowSet 对象中的当前行设置为原始行。

      此方法在当前行的任何修改值与数据源同步后内部调用。当前行必须标记为不再插入、删除或更新。

      调用 setOriginalRow 是不可逆的。

      抛出:
      SQLException - 如果没有当前行或在重置原始行的内容时遇到错误
      参见:
    • getTableName

      String getTableName() throws SQLException
      返回用于创建此 CachedRowSet 对象的对象(表)的标识符。此名称可以在多个场合下设置,规范对此设置的次数或标准实现是否应跟踪先前的表名没有限制。
      返回:
      给出此 CachedRowSet 对象的数据源的表的名称的 String 对象,如果未为表设置名称,则返回 null
      抛出:
      SQLException - 如果返回表名时发生错误
      参见:
    • setTableName

      void setTableName(String tabName) throws SQLException
      将此 CachedRowSet 对象派生自的表的标识符设置为给定的表名。写入器使用此名称确定在同步尝试期间将数据源中的值与 CachedRowSet 对象的值进行比较时要使用哪个表。表标识符还指示应将来自此 CachedRowSet 对象的修改值写入何处。

      CachedRowSet 对象的实现可以从 RowSetMetaDataImpl 对象内部获取名称。

      参数:
      tabName - 一个标识此 CachedRowSet 对象派生自的表的 String 对象;不能为 null,但可以是空字符串
      抛出:
      SQLException - 如果命名表时遇到错误或 tabNamenull
      参见:
    • getKeyColumns

      int[] getKeyColumns() throws SQLException
      返回一个包含一个或多个列号的数组,指示构成此 CachedRowSet 对象中的行的唯一标识符的列。
      返回:
      包含指示哪些列构成此 CachedRowSet 对象中行的主键的列号或列号的数组。如果没有列代表主键,则此数组应为空。
      抛出:
      SQLException - 如果此 CachedRowSet 对象为空
      参见:
    • setKeyColumns

      void setKeyColumns(int[] keys) throws SQLException
      设置此CachedRowSet对象的keyCols字段为给定的列号数组,该数组形成了用于唯一标识此CachedRowSet对象中行的键。

      如果一个CachedRowSet对象成为一个JoinRowSet对象的一部分,那么通过此方法定义的键和生成的约束将在指定为键列的列也成为匹配列时得以维护。

      参数:
      keys - 一个int数组,表示形成此CachedRowSet对象主键的列;数组中的每个元素必须大于0且小于或等于此行集中的列数
      抛出:
      SQLException - 如果给定数组中的任何数字对此行集无效
      参见:
    • createShared

      RowSet createShared() throws SQLException
      返回一个由此CachedRowSet对象支持的新RowSet对象。实际上,两个CachedRowSet对象都在相同数据上有一个游标。因此,由副本所做的任何更改对原始对象和任何其他副本都是可见的,就像原始对象所做的更改对所有副本都是可见的一样。如果副本调用更改基础数据的方法,它调用的方法会通知所有已注册的监听器,就像原始CachedRowSet对象调用时一样。

      此外,由此方法创建的任何RowSet对象将具有与此CachedRowSet对象相同的属性。例如,如果此CachedRowSet对象是只读的,则所有副本也将是只读的。如果更改为可更新,则副本也变为可更新。

      注意:如果多个线程访问从createShared()方法创建的RowSet对象,则指定以下行为以保持共享数据完整性:所有共享RowSet对象的读取和写入应在每个对象和单个基础表结构之间连续进行。

      返回:
      一个新的共享RowSet对象,具有与此CachedRowSet对象相同的属性,并在相同数据上有一个游标
      抛出:
      SQLException - 如果发生错误或底层平台不支持克隆
      参见:
    • createCopy

      CachedRowSet createCopy() throws SQLException
      创建一个RowSet对象,该对象是此CachedRowSet对象中数据的深层副本。与从createShared调用生成的RowSet对象相反,对原始RowSet对象的副本所做的更新不应对原始RowSet对象可见。此外,注册到原始RowSet对象的任何事件监听器不应对新的RowSet副本具有影响。此外,必须保持已建立的任何约束限制。
      返回:
      一个新的RowSet对象,它是此CachedRowSet对象的深层副本,并且完全独立于此CachedRowSet对象
      抛出:
      SQLException - 如果在生成此CachedRowSet对象的副本时发生错误
      参见:
    • createCopySchema

      CachedRowSet createCopySchema() throws SQLException
      创建一个CachedRowSet对象,它是此CachedRowSet对象的空副本。副本不得包含任何内容,而只能表示原始CachedRowSet对象的表结构。此外,必须在新的空CachedRowSet对象中同样强制执行在原始CachedRowSet对象中设置的主键或外键约束。与从createShared方法调用生成的RowSet对象相反,使用createCopySchema方法对此CachedRowSet对象的副本进行的更新不应对其可见。

      应用程序可以从此方法返回的CachedRowSet对象中形成一个WebRowSet对象,以将RowSet模式定义导出到XML以供将来使用。

      返回:
      CachedRowSet对象的空副本
      抛出:
      SQLException - 如果在克隆此CachedRowSet对象的结构时发生错误
      参见:
    • createCopyNoConstraints

      CachedRowSet createCopyNoConstraints() throws SQLException
      创建一个CachedRowSet对象,它是此CachedRowSet对象数据的深层副本,但是独立于它。与从createShared方法调用生成的RowSet对象相反,对此CachedRowSet对象的副本所做的更新不应对其可见。此外,注册到此CachedRowSet对象的任何事件监听器不应对新的RowSet对象具有影响。此外,必须不维护为此CachedRowSet对象建立的任何约束限制。
      返回:
      一个新的CachedRowSet对象,它是此CachedRowSet对象的深层副本,并且完全独立于此CachedRowSet对象
      抛出:
      SQLException - 如果在生成此CachedRowSet对象的副本时发生错误
      参见:
    • getRowSetWarnings

      RowSetWarning getRowSetWarnings() throws SQLException
      检索此RowSet对象调用时报告的第一个警告。此RowSet对象上的后续警告将链接到此方法返回的RowSetWarning对象。每次读取新行时,警告链都会自动清除。不得在已关闭的RowSet对象上调用此方法;这样做将导致抛出SQLException
      返回:
      第一个报告的RowSetWarning对象,如果没有则返回null
      抛出:
      SQLException - 如果在已关闭的RowSet上调用此方法
      参见:
    • getShowDeleted

      boolean getShowDeleted() throws SQLException
      检索一个boolean,指示标记为删除的行是否出现在当前行集中。如果返回true,则已删除的行与当前行一起可见。如果返回false,则行不与当前行集中的行可见。默认值为false

      由于安全考虑或更好地适应某些部署方案,标准行集实现可能选择限制此行为。这留给实现定义,并不代表标准行为。

      注意:允许已删除的行保持可见会使某些标准JDBCRowSet实现方法的行为复杂化。但是,大多数行集用户可以简单地忽略此额外细节,因为只有非常专业的应用程序可能希望利用此功能。

      返回:
      如果已删除的行可见,则返回true;否则返回false
      抛出:
      SQLException - 如果行集实现无法确定标记为删除的行是否可见
      参见:
    • setShowDeleted

      void setShowDeleted(boolean b) throws SQLException
      将属性showDeleted设置为给定的boolean值,该值确定标记为删除的行是否出现在当前行集中。如果值设置为true,则已删除的行立即与当前行集一起可见。如果值设置为false,则已删除的行在当前行集中被设置为不可见。

      由于安全考虑或更好地适应某些部署方案,标准行集实现可能选择限制此行为。这留给实现定义,并不代表标准行为。

      参数:
      b - 如果应显示已删除的行,则为true; 否则为false
      抛出:
      SQLException - 如果行集实现无法重置是否应显示已删除的行
      参见:
    • commit

      void commit() throws SQLException
      每个CachedRowSet对象的SyncProvider包含来自ResultSet或传递给其构造函数的JDBC属性的Connection对象。此方法包装了Connection的提交方法,以允许灵活的自动提交或非自动提交事务控制支持。

      使acceptChanges()方法自上次提交/回滚以来执行的所有更改永久生效。仅当已禁用自动提交模式时才应使用此方法。

      抛出:
      SQLException - 如果发生数据库访问错误或此CachedRowSet中的Connection对象处于自动提交模式
      参见:
    • rollback

      void rollback() throws SQLException
      每个CachedRowSet对象的SyncProvider包含来自原始ResultSet或传递给它的JDBC属性的Connection对象。

      撤消当前事务中所做的所有更改。仅当已禁用自动提交模式时才应使用此方法。

      抛出:
      SQLException - 如果发生数据库访问错误或此CachedRowSet中的Connection对象处于自动提交模式。
    • rollback

      void rollback(Savepoint s) throws SQLException
      每个CachedRowSet对象的SyncProvider包含来自原始ResultSet或传递给它的JDBC属性的Connection对象。

      将当前事务中自上次Savepoint事务标记以来所做的所有更改撤消。仅当已禁用自动提交模式时才应使用此方法。

      参数:
      s - 一个Savepoint事务标记
      抛出:
      SQLException - 如果发生数据库访问错误或此CachedRowSet中的Connection对象处于自动提交模式。
    • rowSetPopulated

      void rowSetPopulated(RowSetEvent event, int numRows) throws SQLException
      通知已注册的侦听器,给定的RowSetEvent对象中的RowSet对象已填充了一定数量的额外行。 numRows参数确保此事件仅在每numRow时触发一次。

      事件的来源可以通过方法event.getSource检索。

      参数:
      event - 包含事件源为RowSet对象的RowSetEvent对象
      numRows - 在填充时,应触发CachedRowSet填充的行数间隔;默认值为零;不能小于fetchSize或零
      抛出:
      SQLException - numRows < 0或numRows < getFetchSize()
    • populate

      void populate(ResultSet rs, int startRow) throws SQLException
      使用给定的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

      void setPageSize(int size) throws SQLException
      设置CachedRowSet对象的页面大小。可以配置CachedRowSet以以页面大小为单位的行批次填充自身。当调用populate()execute()时,CachedRowSet根据用于填充RowSet的原始SQL查询获取额外的页面。
      参数:
      size - CachedRowSet的页面大小
      抛出:
      SQLException - 如果设置CachedRowSet页面大小时发生错误,或者页面大小小于0。
    • getPageSize

      int getPageSize()
      返回CachedRowSet对象的页面大小
      返回:
      一个int页面大小
    • nextPage

      boolean nextPage() throws SQLException
      增加CachedRowSet的当前页面。这会导致CachedRowSet实现获取下一个页面大小的行并填充RowSet,如果剩余的行仍在原始SQL查询的范围内。
      返回:
      如果存在更多页面,则为true;如果这是最后一页,则为false
      抛出:
      SQLException - 如果获取下一页时发生错误,或者在填充或执行之前过早调用此方法。
    • previousPage

      boolean previousPage() throws SQLException
      减少CachedRowSet的当前页面。这会导致CachedRowSet实现获取上一个页面大小的行并填充RowSet。返回的前一页中的行数必须始终保持在用于填充RowSet的原始SQL查询的范围内。
      返回:
      如果成功检索上一页,则为true;如果这是第一页,则为false。
      抛出:
      SQLException - 如果获取上一页时发生错误,或者在填充或执行之前过早调用此方法。