Module  java.sql.rowset
软件包  javax.sql.rowset

Interface CachedRowSet

  • All Superinterfaces:
    AutoCloseableJoinableResultSetRowSetWrapper
    All Known Subinterfaces:
    FilteredRowSetJoinRowSetWebRowSet


    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的默认构造函数来创建默认的CachedRowSet对象。
      CachedRowSetImpl crs = new CachedRowSetImpl(); 
    这个新的CachedRowSet对象将其属性设置为BaseRowSet对象的默认属性,此外,它将具有一个RIOptimisticProvider对象作为其同步提供程序。 RIOptimisticProvider ,RI中包含的两个SyncProvider实现之一是SyncFactory单例将在未指定同步提供程序时提供的默认提供程序。

    一个SyncProvider对象提供一个CachedRowSet对象与读取器(一个RowSetReader对象),用于从数据源读取数据以填充数据。 可以实现读取器从ResultSet对象或具有表格格式的文件读取数据。 一个SyncProvider对象还提供了一个写入程序(一个RowSetWriter对象),用于在与基础数据源中的数据断开连接时对CachedRowSet对象的数据进行任何修改。

    可以实施作家,以便在检查冲突和避免冲突时采取各种程度的谨慎行事。 (当数据源中的某个值已经更改后,数据源中的值已经更改,并且该行的值由该值填充,就会发生冲突。) RIOptimisticProvider实现假定将存在很少或没有冲突,因此不设置锁定。 它只有在没有冲突时才更新来自CachedRowSet对象的值的数据源。 可以实现其他写入器,使得它们总是将修改的数据写入数据源,这可以通过不检查冲突来实现,或者通过设置足以阻止数据源中的数据的锁定,在频谱的另一端改变。 还有其他作家的实现可以在两者之间。

    A CachedRowSet对象可以使用已经在SyncFactory单例中注册的任何SyncProvider实现。 应用程序可以通过调用以下代码行来找出已经注册了哪些SyncProvider实现。

      java.util.Enumeration providers = SyncFactory.getRegisteredProviders(); 

    一个CachedRowSet对象有两种方法来指定它将使用哪个SyncProvider对象。

    • 向构造函数提供实现的名称
      以下代码CachedRowSet创建使用默认值初始化的CachedRowSet对象crs2 ,但其SyncProvider对象为SyncProvider
        CachedRowSetImpl crs2 = new CachedRowSetImpl(
                                       "com.fred.providers.HighAvailabilityProvider"); 
    • 设置SyncProvider使用CachedRowSet方法setSyncProvider
      以下代码SyncProvider重置用于crsCachedRowSet对象,该对象是使用默认构造函数创建的CachedRowSet对象。
        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

    应用程序可以获取有关在列信息CachedRowSet通过调用对象ResultSetMetaDataRowSetMetaData一个上的方法RowSetMetaData对象。 以下代码片段(其中crs是一个CachedRowSet对象)说明了该过程。 第一行创建一个RowSetMetaData对象,其中包含有关crs中的列的信息。 ResultSet接口继承的方法getMetaData返回一个ResultSetMetaData对象,该对象在分配给变量rsmd之前被转换为一个RowSetMetaData对象。 第二行找到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对象,实现必须重写getMetaData()中定义的方法java.sql.ResultSet并返回一个RowSetMetaData对象。

    3.0更新CachedRowSet对象

    更新CachedRowSet对象类似于更新ResultSet对象,但是,因为它正在更新而行集没有连接到它的数据源时,必须采取额外的步骤,以实现在其基础数据源的改变。 调用方法updateRowinsertRowCachedRowSet对象也必须调用方法acceptChanges以将更新写入数据源。 以下示例,其中游标位于CachedRowSet对象crs中的行上,显示了更新当前行中的两列值所需的代码,并更新了RowSet对象的底层数据源。
      crs.updateShort(3, 58);
         crs.updateInt(4, 150000);
         crs.updateRow();
         crs.acceptChanges(); 

    下一个示例演示移动到插入行,在插入行上构建一个新行,将其插入到行集中,然后调用方法acceptChanges将新行添加到底层数据源。 请注意,与getter方法一样,updater方法可以使用列索引或列名来指定正在执行的列。

      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对象的写入程序来写入数据源的更改。 为此,作者必须花费与该数据源建立连接的费用。 前述两个代码片段调用方法acceptChanges调用之后立即updateRowinsertRow 但是,当有多行被更改时,在完成所有调用updateRowinsertRow之后调用acceptChanges更有效。 如果acceptChanges仅被调用一次,则只需要建立一个连接。

    4.0更新基础数据源

    当执行方法acceptChangesCachedRowSet对象的作者(一个RowSetWriterImpl对象)被称为幕后,将对行集的更改写入底层数据源。 实现写入程序与数据源建立连接并向其写入更新。

    如第1节“创建CachedRowSet对象”中所述,可以通过实现SyncProvider接口提供CachedRowSet 默认参考实现提供程序, RIOptimisticProvider ,其RIOptimisticProvider实现了使用乐观并发控制机制。 也就是说,当数据库与数据库断开连接时,它不会在底层数据库中保持锁定,只需在将数据写入数据源之前检查是否存在任何冲突。 如果有任何冲突,它不会对数据源写任何东西。

    SyncProvider类提供的读写器工具是可插拔的,可以进行数据检索和更新的定制。 如果需要不同的并发控制机制,可以使用方法setSyncProvider插入SyncProvider的不同实现。

    为了使用乐观并发控制例程, RIOptimisticProvider维护其当前值及其原始值(其紧邻当前值之前的值)。 请注意,如果没有对RowSet对象中的数据进行RowSet ,则其当前值及其原始值是相同的,两者都是最初填充RowSet对象的值。 但是,一旦RowSet对象中的任何值都已更改,当前值和原始值将不同,但在此阶段,原始值仍为初始值。 随着对RowSet对象中的数据进行任何后续更改,其原始值和当前值仍将不同,但其原始值将是先前为当前值的值。

    跟踪原始值允许作者将RowSet对象的原始值与数据库中的值进行比较。 如果数据库中的值与RowSet对象的原始值不同,这意味着数据库中的值已更改,则存在冲突。 作家是否检查冲突,检查程度如何,以及处理冲突的方式都取决于实施方式。

    5.0注册和通知听众

    作为JavaBeans组件,所有行集都参与到JavaBeans事件模型中,继承用于注册监听器的方法,并通知他们从BaseRowSet类中的更改。 一个CachedRowSet对象的侦听器是一个组件,希望CachedRowSet有更改时被通知。 例如,如果CachedRowSet对象包含查询的结果,并且这些结果正在以表格和条形图形式显示,则表格和条形图可以注册为具有行集的侦听器,以便它们可以将其自身更新为反映变化。 要成为监听器,表和条形图类必须实现RowSetListener接口。 然后可以将它们添加到CachedRowSet对象的侦听器列表中,如以下代码行所示。
      crs.addRowSetListener(table);
        crs.addRowSetListener(barGraph); 
    移动光标或更改数据的每个CachedRowSet方法也会通知已注册的侦听器,所以tablebarGraph将在crs发生更改时crs

    6.0将数据传递给瘦客户端

    使用CachedRowSet对象的主要原因之一是在应用程序的不同组件之间传递数据。 因为它是可序列化的,所以可以使用CachedRowSet对象,例如,将通过网络运行在服务器环境中的企业JavaBeans组件执行的查询的结果发送到在Web浏览器中运行的客户端。

    CachedRowSet对象断开连接时,它可能比具有相同数据的ResultSet对象要精简。 因此,它可以特别适用于将数据发送到诸如PDA的瘦客户端,由于资源限制或安全考虑,使用JDBC驱动程序是不合适的。 因此, CachedRowSet对象提供了一种“获取行”的方法,而不需要实现完整的JDBC API。

    7.0滚动和更新

    CachedRowSet对象的第二个主要用途是为不提供这些功能的ResultSet对象提供滚动和更新。 换句话说,当DBMS不提供完全支持滚动和更新时,可以使用CachedRowSet对象来增强启用JDBC技术的驱动程序(以下称为“JDBC驱动程序”)的功能。 为了实现让非滚动的效果和只读ResultSet对象滚动和可更新,程序员只需创建一个CachedRowSet填充了对象ResultSet对象的数据。 这在以下代码片段中演示,其中stmt是一个Statement对象。
      ResultSet rs = stmt.executeQuery("SELECT * FROM EMPLOYEES");
        CachedRowSetImpl crs = new CachedRowSetImpl();
        crs.populate(rs); 

    对象crs现在包含表EMPLOYEES中的数据,就像对象rs一样。 不同的是, crs的光标可以向前,向后或特定行移动,即使rs的光标只能向前移动。 此外, crs可以更新,即使rs不是因为默认情况下,一个CachedRowSet对象既可滚动CachedRowSet更新。

    总而言之,一个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类提供了一组设置方法,用于设置其params字段中的元素。 以下代码片段演示如何从上一个示例中设置查询中的两个参数。

      crs.setInt(1, 5000);
        crs.setString(2, "West"); 

    params字段现在包含两个元素,每个元素都是一个数组,两个元素长。 第一个元素是参数号; 第二个是要设置的值。 在这种情况下,第一元件params15000 ,并且所述第二元件是2"West" 当应用程序调用方法execute ,它将依次调用该RowSet对象的读取器,这将依次调用其readData方法。 作为其实现的一部分, readData将得到值params ,并用它们来设置命令的占位符参数。 以下代码片段给出了读者如何在获得Connection对象con之后做出这样的想法。

       PreparedStatement pstmt = con.prepareStatement(crs.getCommand()); reader.decodeParams(); // decodeParams figures out which setter methods to use and does something // like the following: // 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这样的方法。 相反,以下代码片段显示了应用程序可能会做什么。 它设置行集的命令,设置命令的参数,并执行命令。 简单地通过调用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设置要包括在页面中的行数。 换句话说,如果页面大小设置为5,则会一次从数据源中提取五行数据块。 应用程序还可以选择设置一次可能获取的最大行数。 如果最大行数设置为零,或者没有设置最大行数,则每次可以获取的行数没有限制。

    属性设置完成后, 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对象作为参数。 此代码传递executeConnection对象conHandle。

    请注意,以下代码片段和前一个代码片段之间有两个区别。 首先,方法setMaxRows未被调用,因此对于crs可能包含的行数没有限制。 (记住, crs总是具有可以在内存中存储多少数据的重要限制。)第二个区别是,您不能通过方法execute ResultSet对象中从开始检索行的行号。 该方法始终以第一行开头。

      CachedRowSet crs = new CachedRowSetImpl();
         crs.setPageSize(5);
         crs.execute(conHandle); 
    此代码运行后, crs将包含由crs命令生成的ResultSet对象中的ResultSet数据。 crs的作者将使用conHandle连接到数据源并执行命令crs 然后,应用程序能够以与crs中的数据相同的方式对其进行操作,这与其他任何其他CachedRowSet对象中的数据操作相同。

    要访问下一页(数据块),应用程序将调用方法nextPage 此方法创建一个新的CachedRowSet对象,并将其填充下一页数据。 例如,假设CachedRowSet对象的命令返回一个具有1000行数据的ResultSet对象rs 如果页面大小已设置为100,则首次调用方法nextPage将创建一个CachedRowSet对象,该对象包含前100行的rs 在完成前100行中的数据所需的处理之后,应用程序可以再次调用方法nextPage以创建另一个CachedRowSet对象,其中第二个100行来自rs 来自第一个CachedRowSet对象的数据将不再在内存中,因为它被替换为第二个CachedRowSet对象的数据。 在方法nextPage的第十个调用之后,第10个CachedRowSet对象将包含存储在存储器中的来自rs的最后100行数据。 在任何给定时间,只有一个CachedRowSet对象的数据存储在内存中。

    该方法nextPage返回true只要当前页不是各行的最后一页false时,有没有更多的页面。 因此,它可以在while循环中用于检索所有页面,如以下代码行所示。

      CachedRowSet crs = CachedRowSetImpl();
         crs.setPageSize(100);
         crs.execute(conHandle);
    
         while(crs.nextPage()) {
             while(crs.next()) {
                 . . . // operate on chunks (of 100 rows each) in crs,
                       // row by row
             }
         } 
    运行此代码片段后,应用程序将遍历所有1000行,但一次内存中不得超过100行。

    CachedRowSet接口也定义了方法previousPage 正如方法nextPage类似于ResultSet方法next ,方法previousPage类似于ResultSet方法previous 类似于方法nextPagepreviousPage创建CachedRowSet含有设置为页大小的行数物体。 因此,例如,方法previousPage可以在前面的代码片段的末尾的while循环中使用,以便通过从最后一页到第一页的页面返回。 方法previousPage也类似于nextPage ,因为它可以在while循环中使用,除了它返回true ,只要前面有另一个页面和false当它没有更多的页面。

    通过将光标定位在每个页面的最后一行之后,如下面的代码片段中所做的那样,方法previous从最后一行导航到每个页面中的第一行。 代码也可以将光标留在每个页面上的第一行之前,然后使用while循环中的方法next从第一行到最后一行浏览每个页面。

    以下代码段假定从上一个代码片段中继续,这意味着第10个CachedRowSet对象的游标位于最后一行。 代码将光标移动到最后一行之后,首先调用方法previous将光标放回最后一行。 在完成最后一页( CachedRowSet对象crs )中的所有行后,代码然后进入while循环以进入第九页,向后排列,转到第八页,往后排,等等到第一页的第一行。

      crs.afterLast();
         while(crs.previous())  {
             . . . // navigate through the rows, last to first
         {
         while(crs.previousPage())  {
             crs.afterLast();
             while(crs.previous())  {
                 . . . // go from the last row to the first row of each page
             }
         } 
    从以下版本开始:
    1.5
    • 字段详细信息

      • COMMIT_ON_ACCEPT_CHANGES

        @Deprecated
        static final boolean COMMIT_ON_ACCEPT_CHANGES
        已过时。 因为这个字段是final(它是接口的一部分),所以它的值不能被改变。
        原因CachedRowSet对象SyncProvider提交更改时acceptChanges()被调用。 如果设置为false,则在CachedRowSet接口事务方法之一之前,将不会提交更改。
        另请参见:
        commit()rollback()Constant Field Values
    • 方法详细信息

      • populate

        void populate​(ResultSet data)
               throws SQLException
        填充此CachedRowSet从给定数据对象ResultSet对象。

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

        参数
        data -所述 ResultSet包含数据对象读入此 CachedRowSet对象
        异常
        SQLException - 如果提供了空值为 ResultSet对象,或者该 CachedRowSet对象无法检索到关联的 ResultSetMetaData对象
        另请参见:
        execute(java.sql.Connection)ResultSetResultSetMetaData
      • execute

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

        CachedRowSet对象的读者将使用conn建立与数据源的连接,以便它可以执行行集的命令,并从所生成的ResultSet对象中读取数据到该CachedRowSet对象。 此方法在填充此CachedRowSet对象后也会关闭conn

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

        参数
        conn - 具有有效属性的标准JDBC Connection对象
        异常
        SQLException - 如果提供无效的 Connection对象或建立与数据源的连接时发生错误
        另请参见:
        populate(java.sql.ResultSet)Connection
      • acceptChanges

        void acceptChanges​()
                    throws SyncProviderException
        传播行更新,插入和删除对此CachedRowSet对象的更改对基础数据源。

        这个方法要求这个CachedRowSet对象的作者在幕后做这些工作。 标准CachedRowSet实现应使用SyncFactory单例来获取提供RowSetWriter对象(作者)的SyncProvider实例。 作者将尝试将此CachedRowSet对象中所做的更改传播回数据源。

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

        根据正在使用的SyncProvider实现的同步级别,作者将将原始值与数据源中的值进行比较,以检查是否存在冲突。 当有冲突时, RIOptimisticProvider实现,例如,抛出一个SyncProviderException并且不写任何数据源。

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

        一些提供商的实现可以使用锁来确保没有冲突。 在这种情况下,保证当调用方法acceptChanges时,写入程序将成功写入数据源的更改。 这种方法可以立即方法后调用updateRowinsertRow ,或deleteRow一直呼吁,但它是更有效的已作出的所有修改完成后,只有一个连接需要建立只有一次调用它。

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

        异常
        SyncProviderException - 如果底层同步提供程序的写入程序无法将更新写回数据源
        另请参见:
        acceptChanges(java.sql.Connection)RowSetWriterSyncFactorySyncProviderSyncProviderExceptionSyncResolver
      • acceptChanges

        void acceptChanges​(Connection con)
                    throws SyncProviderException
        将所有行更新,插入和删除备份此更改数据源CachedRowSet使用指定的对象Connection对象建立到数据源的连接。

        acceptChanges方法的其他版本不会传递连接,因为它使用已在Connection对象中定义的RowSet对象,该对象是用于初始填充的连接。

        这种形式的方法acceptChanges类似于不带参数的形式; 然而,与其他形式不同,只有当底层数据源是JDBC数据源时,才能使用此表单。 更新Connection属性必须由使用SyncProvider重置RowSetWriter配置,以确保所述的内容CachedRowSet对象被正确地同步。

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

        根据正在使用的SyncProvider实现的同步级别,作者将将原始值与数据源中的值进行比较,以检查是否存在冲突。 当有冲突时, RIOptimisticProvider实现,例如,抛出一个SyncProviderException ,并没有写任何数据源。

        应用程序可以选择捕获SyncProviderException对象并检索其包含的SyncResolver对象。 SyncResolver对象SyncResolver列出冲突,并在数据源上设置锁定,以避免在当前冲突解决时发生冲突。 此外,对于每个冲突,它提供了检查冲突并设置应该在数据源中持久存在的值的方法。 所有冲突解决后,应用程序必须再次调用acceptChanges方法将解析的值写入数据源。 如果数据源中的所有值都已经是要保持的值,方法acceptChanges什么都不做。

        一些提供商的实现可以使用锁来确保没有冲突。 在这种情况下,保证当调用方法acceptChanges时,写入程序将成功写入数据源的更改。 这种方法可以立即方法后调用updateRowinsertRow ,或deleteRow一直呼吁,但它是更有效的已作出的所有修改完成后,只有一个连接需要建立只有一次调用它。

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

        参数
        con - 标准JDBC Connection对象
        异常
        SyncProviderException - 如果底层同步提供程序的写入程序无法将更新写回数据源
        另请参见:
        acceptChanges()RowSetWriterSyncFactorySyncProviderSyncProviderExceptionSyncResolver
      • restoreOriginal

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

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

        异常
        SQLException - 如果发生错误,将此 CachedRowSet对象的当前值 CachedRowSet到其先前值
        另请参见:
        RowSetListener.rowSetChanged(javax.sql.RowSetEvent)
      • release

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

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

        元数据(包括JDBC属性和同步SPI属性)被维护以备将来使用。 重要的是,诸如command属性的属性与最初建立此CachedRowSet对象的始发数据源相关。

        该方法清空行集,而不是close方法,它将整个行集标记为可恢复,以允许垃圾收集器的行集的Java VM资源。

        异常
        SQLException - 如果发生错误,则会刷新此 CachedRowSet对象的内容
        另请参见:
        RowSetListener.rowSetChanged(javax.sql.RowSetEvent)ResultSet.close()
      • undoDelete

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

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

        • CachedRowSet.absolute
        • CachedRowSet.first
        • CachedRowSet.last
        异常
        SQLException - 如果(1)当前行尚未被删除,或者(2)光标位于插入行之前,第一行之前或最后一行之后
        另请参见:
        undoInsert()ResultSet.cancelRowUpdates()
      • undoInsert

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

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

        • CachedRowSet.absolute
        • CachedRowSet.first
        • CachedRowSet.last
        异常
        SQLException - 如果(1)当前行尚未插入,或者(2)光标位于第一行之前,最后一行之后或插入行上
        另请参见:
        undoDelete()ResultSet.cancelRowUpdates()
      • undoUpdate

        void undoUpdate​()
                 throws SQLException
        如果该行已被修改,立即反转最后一次更新操作。 可以调用此方法来反转所有列的更新,直到在上一次同步( acceptChanges )或群体之前,一行中的所有更新已经回滚到其状态。 在执行插入行更新时也可以调用此方法。

        可以undoUpdate集的生命周期中的任何时间调用undoUpdate ; 然而,在发生同步之后,该方法直到进一步修改行集数据才有效果。

        异常
        SQLException - 如果光标位于第 CachedRowSet行中的第一行之前或之后的 CachedRowSet对象中的最后一行
        另请参见:
        undoDelete()undoInsert()ResultSet.cancelRowUpdates()
      • columnUpdated

        boolean columnUpdated​(int idx)
                       throws SQLException
        指示此 CachedRowSet对象的当前行中的指定列是否已更新。
        参数
        idx - 一个 int标识要检查更新的列
        结果
        true如果指定列已被明显更新; 否则为false
        异常
        SQLException - 如果光标位于插入行上,则在第一行之前或最后一行之后
        另请参见:
        DatabaseMetaData.updatesAreDetected(int)
      • columnUpdated

        boolean columnUpdated​(String columnName)
                       throws SQLException
        指示此 CachedRowSet对象的当前行中的指定列是否已更新。
        参数
        columnName - 一个 String对象,给出要检查更新的列的名称
        结果
        true如果列已经可见更新; false否则
        异常
        SQLException - 如果游标在插入行上,在第一行之前,或最后一行之后
        另请参见:
        DatabaseMetaData.updatesAreDetected(int)
      • toCollection

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

        CachedRowSet接口的标准参考实现使用行集的TreeMap对象,每行中的值包含在Vector对象中。 预计大多数实现将会这样做。

        TreeMap类型的收藏保证地图将按照按键顺序升序,按照键的类的自然顺序进行排序。 每个键引用Vector对应于一个行对象RowSet对象。 因此,每个Vector对象的大小必须与RowSet对象中的列数完全相同。 TreeMap集合使用的密钥由实现决定,该实现可以通过已经在RowSet对象本身或基础SQL数据上设置的密钥来选择利用内部RowSet表格结构中可用的集合密钥。

        结果
        一个 Collection对象,其中包含此 CachedRowSet对象中每行的值
        异常
        SQLException - 如果产生集合的错误
        另请参见:
        toCollection(int)toCollection(String)
      • toCollection

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

        标准参考实现使用一个Vector对象来包含列值,并且预计大多数实现将执行相同的操作。 如果使用Vector对象,它的大小必须与CachedRowSet对象中的行数完全相同。

        参数
        column - 一个 int表示其值将在 Collection对象中表示的列
        结果
        一个 Collection对象,其中包含存储在此 CachedRowSet对象的指定列中的值
        异常
        SQLException - 如果生成集合时发生错误或提供了无效的列ID
        另请参见:
        toCollection()toCollection(String)
      • toCollection

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

        标准参考实现使用Vector对象来包含列值,并且预期大多数实现将执行相同的操作。 如果使用Vector对象,则其大小必须与CachedRowSet对象中的行数完全相等。

        参数
        column - 一个 String对象,给出其值要在集合中表示的列的名称
        结果
        一个 Collection对象,其中包含存储在该 CachedRowSet对象的指定列中的值
        异常
        SQLException - 如果生成集合时发生错误或提供了无效的列ID
        另请参见:
        toCollection()toCollection(int)
      • getSyncProvider

        SyncProvider getSyncProvider​()
                              throws SQLException
        检索CachedRowSet对象的SyncProvider实现。 在内部,行方法使用此方法来触发行集和数据源之间的读取或写入操作。 例如,行集可能需要从SyncProvider获取行集读取器( RowSetReader对象)上的SyncProvider以允许行集被填充。
          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(java.lang.String)
      • setSyncProvider

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

        应始终使用可用的SyncProvider机制来实现CachedRowSet实现,但是有些情况下需要或需要重置SyncProvider对象。 例如,应用程序可能希望一次使用默认的SyncProvider对象,然后选择使用最近可用的提供程序,并更好地满足其需求。

        重新设置SyncProvider对象将导致RowSet对象从SyncFactory请求新的SyncProvider实现。 这具有重置所有以前的连接和与始发数据源的关系的效果,并且可能潜在地彻底改变断开的行集的同步行为。

        参数
        provider - 一个 String对象,给出 SyncProvider实现的完全限定类名
        异常
        SQLException - 如果尝试重置 SyncProvider实现时发生错误
        另请参见:
        getSyncProvider()
      • size

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

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

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

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

        • ResultSet.TYPE_SCROLL_INSENSITIVE
        • ResultSet.CONCUR_UPDATABLE

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

        结果
        一个 ResultSet对象,其中包含此 CachedRowSet对象的原始值
        异常
        SQLException - 如果发生错误,产生 ResultSet对象
      • getOriginalRow

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

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

        • ResultSet.TYPE_SCROLL_INSENSITIVE
        • ResultSet.CONCUR_UPDATABLE
        结果
        行的原始结果集
        异常
        SQLException - 如果没有当前行
        另请参见:
        setOriginalRow()
      • setOriginalRow

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

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

        致电setOriginalRow是不可逆转的。

        异常
        SQLException - 如果没有当前行或遇到错误,重置原始行的内容
        另请参见:
        getOriginalRow()
      • getTableName

        String getTableName​()
                     throws SQLException
        返回用于创建此CachedRowSet对象的对象(表)的标识符。 该名称可以在多个场合设置,并且规范对这可能发生的次数没有限制,或者标准实现是否应该跟踪先前的表名。
        结果
        一个 String对象,提供的表的名称是数据的这种情况的来源 CachedRowSet对象或 null如果没有名字已被设置为表
        异常
        SQLException - 如果返回表名遇到错误
        另请参见:
        ResultSetMetaData.getTableName(int)
      • setTableName

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

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

        参数
        tabName - 一个String对象,用于标识该CachedRowSet对象的导出表; 不能是null但可能是一个空字符串
        异常
        SQLException - 如果遇到命名表或 tabName的错误是 null
        另请参见:
        RowSetMetaData.setTableName(int, java.lang.String)RowSetWriterSyncProvider
      • setKeyColumns

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

        如果一个CachedRowSet对象成为一个的一部分JoinRowSet对象,并将所得约束用这种方法定义的键被保持如果列指定为键列也成为匹配列。

        参数
        keys -的阵列int指示了形成该主键列CachedRowSet对象; 数组中的每个元素必须大于0 ,小于或等于此行集中的列数
        异常
        SQLException - 如果给定数组中的任何数字对此行集无效
        另请参见:
        getKeyColumns()Joinable.setMatchColumn(String)Joinable.setMatchColumn(int)
      • createShared

        RowSet createShared​()
                     throws SQLException
        返回一个新的RowSet对象,该对象由与此CachedRowSet对象相同的数据支持。 实际上, CachedRowSet对象都有一个游标在相同的数据上。 因此,重复的所有更改对原件和任何其他重复项都是可见的,正如原件所做的更改对其所有重复项都可见。 如果一个副本调用一个更改底层数据的方法,则它调用的方法通知所有注册的监听器,就像原始的CachedRowSet对象调用一样。

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

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

        结果
        一个新的共享的 RowSet对象,具有与此 CachedRowSet对象相同的属性,并且具有相同数据的游标
        异常
        SQLException - 如果发生错误或基础平台不支持克隆
        另请参见:
        RowSetEventRowSetListener
      • createCopy

        CachedRowSet createCopy​()
                         throws SQLException
        创建一个RowSet对象,该对象是此CachedRowSet对象中的数据的深层副本。 与此相反的RowSet从生成的对象createShared号召,在原有的副本所做的更新RowSet对象必须是不可见的原RowSet对象。 而且,任何在RowSet原始注册的事件监听器都不能超过新的RowSet副本。 另外,必须保持建立的约束限制。
        结果
        一个新的 RowSet对象,这是这个 CachedRowSet对象的深层副本,完全独立于这个 CachedRowSet对象
        异常
        SQLException - 如果在生成 CachedRowSet对象的副本时发生错误
        另请参见:
        createShared()createCopySchema()createCopyNoConstraints()RowSetEventRowSetListener
      • createCopySchema

        CachedRowSet createCopySchema​()
                               throws SQLException
        创建CachedRowSet对象,该对象为该CachedRowSet对象的空白副本。 副本不得包含任何内容,但仅表示原始CachedRowSet对象的表结构。 另外,起始的CachedRowSet对象中设置的主键或外键约束必须在新的空的CachedRowSet对象中同样强制执行。 与此相反的RowSet从生成的对象createShared方法调用,更新此副本所做CachedRowSet与对象createCopySchema方法不能是可见。

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

        结果
        这个 CachedRowSet对象的空拷贝
        异常
        SQLException - 如果在克隆 CachedRowSet对象的结构中发生错误
        另请参见:
        createShared()createCopySchema()createCopyNoConstraints()RowSetEventRowSetListener
      • createCopyNoConstraints

        CachedRowSet createCopyNoConstraints​()
                                      throws SQLException
        创建一个CachedRowSet对象,该对象是该CachedRowSet对象数据的深层副本,但CachedRowSet无关。 与从createShared方法调用生成的RowSet对象不同,对此CachedRowSet对象的副本的更新CachedRowSet不可见。 此外,任何注册此CachedRowSet对象的事件侦听器都不得超过新的RowSet对象的范围。 此外,为该CachedRowSet对象建立的任何约束限制不得在副本中保留。
        结果
        CachedRowSet对象,这是一个深刻的副本 CachedRowSet目的,是完全独立的这个 CachedRowSet对象
        异常
        SQLException - 如果在生成 CachedRowSet对象的副本时发生错误
        另请参见:
        createCopy()createShared()createCopySchema()RowSetEventRowSetListener
      • getRowSetWarnings

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

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

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

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

        结果
        true如果删除的行是可见的; 否则为false
        异常
        SQLException - 如果行集实现无法确定标记删除的行是否可见
        另请参见:
        setShowDeleted(boolean)
      • setShowDeleted

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

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

        参数
        b - true如果删除的行应该显示; false否则
        异常
        SQLException - 如果行集实现无法重置是否应删除的行可见
        另请参见:
        getShowDeleted()
      • commit

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

        进行acceptChanges()方法执行的所有更改,因为之前的提交/回滚永久。 只有当自动提交模式被禁用时,才应该使用此方法。

        异常
        SQLException - 如果发生数据库访问错误或此 CachedRowSet此Connection对象处于自动提交模式
        另请参见:
        Connection.setAutoCommit(boolean)
      • rollback

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

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

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

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

        将当前事务中所做的所有更改撤回到最后一个Savepoint事务标记。 只有当自动提交模式被禁用时,才应该使用此方法。

        参数
        s - A Savepoint交易标记
        异常
        SQLException - 如果发生数据库访问错误或此 CachedRowSet此Connection对象处于自动提交模式。
      • rowSetPopulated

        void rowSetPopulated​(RowSetEvent event,
                             int numRows)
                      throws SQLException
        通知已注册的侦听器给定的RowSetEvent对象中的RowSet对象已经填充了许多其他行。 numRows参数确保这个事件只会被触发numRow

        事件的源可以使用event.getSource方法检索。

        参数
        event - 一个 RowSetEvent对象,其中包含作为事件源的 RowSet对象
        numRows - 填充时, CachedRowSet人口应该触发的行数间隔; 默认值为零; 不能小于fetchSize或零
        异常
        SQLException - numRows < 0 or numRows < getFetchSize()
      • populate

        void populate​(ResultSet rs,
                      int startRow)
               throws SQLException
        填充此CachedRowSet从给定数据对象ResultSet对象。 虽然与populate(ResultSet)方法相关,但是提供了一个附加参数,以允许从其中填充CachedRowSet实例的ResultSet起始位置。

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

        参数
        startRow -在位置 ResultSet从哪里开始在此填充记录 CachedRowSet
        rs -所述 ResultSet包含数据对象读入此 CachedRowSet对象
        异常
        SQLException - 如果提供了空值为 ResultSet对象,或者该 CachedRowSet对象无法检索到关联的 ResultSetMetaData对象
        另请参见:
        execute(java.sql.Connection)populate(ResultSet)ResultSetResultSetMetaData
      • setPageSize

        void setPageSize​(int size)
                  throws SQLException
        设置CachedRowSet对象的页面大小。 A CachedRowSet可以被配置为在页面大小的批量行中填充自身。 当调用populate()execute()CachedRowSet将根据用于填充RowSet的原始SQL查询获取附加页面。
        参数
        size -在页面大小 CachedRowSet
        异常
        SQLException - 如果出现错误,请设置 CachedRowSet页面大小或页面大小小于0。
      • getPageSize

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

        boolean nextPage​()
                  throws SQLException
        增加当前页面的CachedRowSet 这将导致CachedRowSet实现获取下一页大小的行并填充RowSet,如果剩余的行保留在用于填充RowSet的原始SQL查询的范围内。
        结果
        如果存在更多页面,则为true 如果这是最后一页,则为false
        异常
        SQLException - 如果获取下一页出现错误,或者在填充或执行前是否提前调用此方法。
      • previousPage

        boolean previousPage​()
                      throws SQLException
        减少当前页面的CachedRowSet 这将导致CachedRowSet实现获取上一页大小的行并填充RowSet。 前一页中返回的行数必须始终保留在用于填充RowSet的原始SQL查询的范围内。
        结果
        如果前一页被成功检索,则为true; 如果这是第一页,则为false。
        异常
        SQLException - if an error occurs fetching the previous page, or if this method is called prematurely before populate or execute.