模块  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集使用该值填充自身后,数据源中的值发生更改时会发生冲突。) RIOptimisticProvider实现假定冲突很少或没有冲突,因此不设置锁定。 仅当没有冲突时,它才会使用CachedRowSet对象中的值更新数据源。 可以实现其他编写器,以便它们始终将修改后的数据写入数据源,这可以通过不检查冲突来实现,或者在频谱的另一端,通过设置足以防止数据源中的数据的锁来实现。改变。 还有其他作家的实现可以介于两者之间。

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

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

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

    • 将实现的名称提供给构造函数
      以下代码行创建CachedRowSet对象crs2 ,该对象使用默认值初始化,但其SyncProvider对象是指定的对象。
        CachedRowSetImpl crs2 = new CachedRowSetImpl(
                                       "com.fred.providers.HighAvailabilityProvider"); 
    • 设置SyncProvider使用CachedRowSet方法setSyncProvider
      下面的代码行重置SyncProvider对象CRS,CachedRowSet与默认构造创建的对象。
        crs.setSyncProvider("com.fred.providers.HighAvailabilityProvider"); 
    有关详细信息,请参阅SyncFactorySyncProvider的注释。

    2.0从CachedRowSet对象检索数据

    使用从ResultSet接口继承的getter方法从CachedRowSet对象检索数据。 以下示例(其中crsCachedRowSet对象)演示了如何遍历行,检索每行中的列值。 第一个示例使用带有列号的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对象。 以下代码片段(其中crsCachedRowSet对象)说明了该过程。 第一行创建一个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调用acceptChanges一次,则只需要建立一个连接。

    4.0更新基础数据源

    执行方法acceptChanges ,将在CachedRowSet调用CachedRowSet对象的writer( RowSetWriterImpl对象),以将对行集所做的更改写入基础数据源。 实现编写器以建立与数据源的连接并向其写入更新。

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

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

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

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

    5.0注册和通知监听器

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

    6.0将数据传递给瘦客户端

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

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

    7.0滚动和更新

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

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

    总之, CachedRowSet对象可以被视为一组在数据源外部缓存的断开连接的行。 它既瘦又可序列化,可以通过线路轻松发送,非常适合将数据发送到瘦客户端。 但是, CachedRowSet对象确实有一个限制:它的大小受限于它一次可以存储在内存中的数据量。

    8.0获得通用数据访问

    CachedRowSet类的另一个优点是它可以从关系数据库以外的源检索和存储数据。 可以实现行集的阅读器,以使用来自任何表格数据源(包括电子表格或平面文件)的数据来读取和填充其行集。 因为可以从头创建CachedRowSet对象及其元数据,所以充当行集工厂的组件可以使用此功能创建包含来自非SQL数据源的数据的行集。 尽管如此,预计大多数情况下, CachedRowSet对象将包含使用JDBC API从SQL数据库中提取的数据。

    9.0设置属性

    所有行集都维护一组属性,通常使用工具设置。 行集具有的属性的数量和种类将有所不同,具体取决于行集的作用以及它如何获取其数据。 例如,从ResultSet对象获取其数据的行集需要设置进行数据库连接所需的属性。 如果行集使用DriverManager工具建立连接,则需要为标识相应驱动程序的JDBC URL设置属性,并且需要设置提供用户名和密码的属性。 另一方面,如果行集使用DataSource对象进行连接(这是首选方法),则不需要设置JDBC URL的属性。 相反,它需要为数据源的逻辑名称,用户名和密码设置属性。

    注意:要使用DataSource对象进行连接,必须使用使用Java命名和目录接口(JNDI)API的命名服务注册DataSource对象。 此注册通常由以系统管理员身份行事的人员完成。

    为了能够使用数据库中的数据填充自身,行集需要设置命令属性。 此属性是一个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字段中设置元素的setter方法。 以下代码片段演示了如上一个示例中的查询中的两个参数设置。

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

    params字段现在包含两个元素,每个元素都是两个元素长的数组。 第一个元素是参数号; 第二个是要设置的值。 在这种情况下,第一元件params15000 ,并且所述第二元件是2"West" 当应用程序调用方法execute ,它将依次调用此RowSet对象的读取器,该读取器将依次调用其readData方法。 作为其实现的一部分, readData将得到值params ,并用它们来设置命令的占位符参数。 在获得Connection对象con之后,以下代码片段给出了读者如何执行此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等方法的应用程序中。 相反,以下代码片段显示了应用程序可能执行的操作。 它设置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设置要包含在页面中的行数。 换句话说,如果页面大小设置为5,则将一次从数据源中提取一行五行数据。 应用程序还可以选择设置一次可以获取的最大行数。 如果将最大行数设置为零,或者未设置最大行数,则一次可以获取的行数没有限制。

    设置属性后,必须使用方法populate或方法execute使用数据填充CachedRowSet对象。 以下代码行演示了使用方法populate 请注意,此版本的方法有两个参数,一个ResultSet句柄和ResultSet对象中的行,从该对象开始检索行。

      CachedRowSet crs = new CachedRowSetImpl();
         crs.setMaxRows(20);
         crs.setPageSize(4);
         crs.populate(rsHandle, 10); 
    当这段代码运行时, crs将从第10行开始用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对象的ResultSet数据。 crs的 编写器将使用conHandle连接到数据源并执行crs命令。 然后,应用程序能够以与对任何其他CachedRowSet对象中的数据进行操作相同的方式对crs中的数据进行操作。

    要访问下一页(数据块),应用程序调用方法nextPage 此方法创建一个新的CachedRowSet对象,并使用下一页数据填充它。 例如,假设CachedRowSet对象的命令返回具有1000行数据的ResultSet对象rs 如果页面大小已设置为100,则第一次调用方法nextPage将创建一个包含前100行rsCachedRowSet对象。 在执行了前100行中的数据操作之后,应用程序可以再次调用方法nextPage来创建另一个具有rs的第二行100的CachedRowSet对象。 来自第一个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()) {
                 . . . // operate on chunks (of 100 rows each) in crs,
                       // row by row
             }
         } 
    运行此代码片段后,应用程序将遍历所有1000行,但一次在内存中的行数不会超过100行。

    CachedRowSet接口还定义了方法previousPage 正如方法nextPage类似于ResultSet方法next ,方法previousPage类似于ResultSet方法previous 与方法nextPage类似, previousPage创建一个CachedRowSet对象,其中包含设置为页面大小的行数。 所以,举例来说,该方法previousPage可以在使用while环在前面的代码片段末端通过从最后一页到第一页的页面导航回。 方法previousPage也类似于nextPage ,因为它可以在while循环中使用,除了它返回true ,只要它前面有另一个页面和false当它前面没有更多页面时。

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

    以下代码片段假定从前一个代码片段继续,这意味着第十个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
        Deprecated.
        Because this field is final (it is part of an interface), its value cannot be changed.
        原因CachedRowSet对象SyncProvider提交更改时acceptChanges()被调用。 如果设置为false,则在CachedRowSet其中一个CachedRowSet接口事务方法之前, 不会提交更改。
        另请参见:
        commit()rollback()常数字段值
    • 方法详细信息

      • populate

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

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

        参数
        data -所述 ResultSet包含数据对象读入此 CachedRowSet对象
        异常
        SQLException - 如果提供了null 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来完成幕后工作。 标准CachedRowSet实现应使用SyncFactory单例来获取提供RowSetWriter对象( RowSetWriter )的SyncProvider实例。 CachedRowSet将尝试将此CachedRowSet对象中所做的更改传播回数据源。

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

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

        应用程序可以选择捕获SyncProviderException对象并检索它包含的SyncResolver对象。 SyncResolver对象SyncResolver列出冲突并在数据源上设置锁定,以避免在解决当前冲突时发生进一步冲突。 此外,对于每个冲突,它提供了检查冲突和设置应该保留在数据源中的值的方法。 解决所有冲突后,应用程序必须再次调用acceptChanges方法将已解析的值写入数据源。 如果数据源中的所有值都已经是要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
        使用指定的Connection对象传播对支持此CachedRowSet对象的数据源的所有行更新,插入和删除更改,以建立与数据源的连接。

        另一个版本的acceptChanges方法未通过连接,因为它使用Connection对象中已定义的RowSet对象,该对象是用于最初填充它的连接。

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

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

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

        应用程序可以选择捕获SyncProviderException对象并检索它包含的SyncResolver对象。 SyncResolver对象SyncResolver列出冲突并在数据源上设置锁定,以避免在解决当前冲突时发生进一步冲突。 此外,对于每个冲突,它提供了检查冲突和设置应该保留在数据源中的值的方法。 解决所有冲突后,应用程序必须再次调用acceptChanges方法将已解析的值写入数据源。 如果数据源中的所有值都已经是要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对象的所有组件都已完成读取之前,无法释放内容。 在触发rowSetChanged事件后,此CachedRowSet对象应返回到正常行为。

        保留元数据(包括JDBC属性和同步SPI属性)以供将来使用。 重要的是,诸如command属性之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 - if(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对象的第一行之前或最后一行之后
        另请参见:
        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实现,如一个TreeMap对象或Vector对象。 必须在Java编程语言null SQL NULL列值表示为null

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

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

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

        Collection<?> toCollection​(int column)
                            throws SQLException
        将此CachedRowSet对象中的指定列转换为Collection对象。 由于Collection框架的抽象性,实现在如何表示此Collection对象方面具有一定的自由度。 每个列值应在通用Collection实现或专用Collection实现(例如Vector对象)中完全表示。 必须在Java编程语言null SQL NULL列值表示为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实现(例如Vector对象)中完全表示。 必须在Java编程语言null SQL NULL列值表示为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方法时,它依次调用reader的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对象,然后选择使用最近可用且最符合其需求的提供程序。

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

        参数
        provider - 提供 SyncProvider实现的完全限定类名的 String对象
        异常
        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对象的修改值的位置。

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

        参数
        tabName - 一个String对象,用于标识从中派生此CachedRowSet对象的表; 不能是null但可能是一个空字符串
        异常
        SQLException - 如果在命名表或 tabName时遇到错误,则为 null
        另请参见:
        RowSetMetaData.setTableName(int, java.lang.String)RowSetWriterSyncProvider
      • getKeyColumns

        int[] getKeyColumns()
                     throws SQLException
        返回一个数组,其中包含一个或多个列号,这些列号表示形成一个键的列,该键唯一标识此 CachedRowSet对象中的行。
        结果
        包含列号或数字的数组,指示哪些列构成此CachedRowSet对象中行的主键。 如果没有列代表主键,则此数组应为空。
        异常
        SQLException - 如果此 CachedRowSet对象为空
        另请参见:
        setKeyColumns(int[])Joinable.getMatchColumnIndexes()Joinable.getMatchColumnNames()
      • 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对象注册的任何事件侦听器都不得具有超过新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包含来自原始ResultSetConnection对象或传递给它的JDBC属性。

        将当前事务中所做的所有更改撤消回最后一个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 or numRows < getFetchSize()
      • populate

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

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

        参数
        startRow -在位置 ResultSet从哪里开始在此填充记录 CachedRowSet
        rs -所述 ResultSet包含数据对象读入此 CachedRowSet对象
        异常
        SQLException - 如果提供了null ResultSet对象或此 CachedRowSet对象无法检索关联的 ResultSetMetaData对象
        另请参见:
        execute(java.sql.Connection)populate(ResultSet)ResultSetResultSetMetaData
      • 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的当前页面。 如果剩余行保留在用于填充RowSet的原始SQL查询的范围内,则会导致CachedRowSet实现获取下一个页面大小的行并填充RowSet。
        结果
        如果存在更多页面,则为true 如果这是最后一页,则为false
        异常
        SQLException - 如果在获取下一页时发生错误,或者在填充或执行之前过早调用此方法。
      • previousPage

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