6.2.3 CachedRowSet 类

       CachedRowSet 类是CachedRowSet 包中最重要的类。它继承自BaseRowSet 类,

CachedRowSet 对象为规范的数据提供了一个无连接的(disconnected) 、可串行化的

(serializable) 可以滚动的(scrollable 指数据指针可以前后移动)的容器。CachedRowSet 对象可以简单地看作是一个与数据库断开连接的结果记录集,它被缓存在数据源之外,因为

所有的数据都被缓存在内存之中,所以CachedRowSet 对象不适合于处理含有海量数据的

记录集。

       CachedRowSet 对象的重要作用是:它可以在作为数据容器,在不同应用程序的不同的

组件之间传送数据。例如,一个运行于Application Server 上的Enterprise JavaBeans  组件可以使用JDBC API   访问数据库,然后可以使用CachedRowSet 对象将数据库返回的数据通过网络发送到运行于客户端浏览器上的Java Applet 程序或者JavaBeans  组件。

       如果客户端由于资源的限制或者出于安全上的考虑,没有办法使用JDBC数据库驱动

程序,例如PersonalJava Clients Personal Digital Assistant (PDA) Network Computer(NC)

等客户端,这时使用CachedRowSet 类就可以提供一个Java Client 用以处理数据库的规

范数据。

       CachedRowSet 类的第三个作用是:它可以通过使用数据源以外的空间缓存记录集的数

据,从而不需要JDBC数据库驱动程序帮助,而实现了结果记录集的数据库游标的前后移

动,还可以执行行更新的操作CachedRowSet 对象在读入数据库的数据时,采用get rows in

的机制,当它更新记录集的数据时采用get changed rows out 的机制。CachedRowSet 对象

获取数据以后,就断开了和数据源的连接只有执行行更新操作时,才再度与数据库建立

连接。某些JDBC驱动程序目前仍然不支持结果记录集的数据库游标的前后移动,这时使

CachedRowSet 类就可以实现你的愿望。

注意:如果你使用的JDBC数据库驱动程序是JDBC-ODBC  桥驱动程序,用ResultSet

接口、Statement 接口以通常的方法访问数据库,似乎无法实现记录集的数据库

游标的前后移动,特别是不能向后移动亦不能定位到任意行去,如果读者碰

到了类似的问题,除了更换JDBC驱动程序以外不妨使用CachedRowSet 类。

       下面我们详细介绍如何使用CachedRowSet

       1)创建CachedRowSet 类的实例对象

如果想使用CachedRowSet 类的强大功能,那么你必须首先创建CachedRowSet 类的实

例对象,如何创建呢?可以使用CachedRowSet 类的构造函数,CachedRowSet 类的构造函数是CachedRowSet() ,该函数没有任何参数CachedRowSet()函数初始化了下面的属性值:

onInsertRow = false

insertRow = null

cursorPos = 0

numRows = 0

showDeleted = false

queryTimeout = 0

maxRows = 0

maxFieldSize = 0

RowSetType = ResultSet.TYPE_SCROLL_INSENSITIVE

concurrency = ResultSet.CONCUR_READ_ONLY

readOnly = false

isolation = Connection .TRANSACTION_READ_COMMITTED

escapeProcessing = true

absolutePos = 0

 

新创建的CachedRowSet 对象缺省可以容纳100 个记录所包含的数据。

指定CachedRowSet 对象和数据库建立连接的连接属性创建了CachedRowSet 对象,就可以使用setPassword() setUsername() setURL()等方法

指定CachedRowSet 对象和数据库建立连接的连接参数(当然了,需要首先载入JDBC驱动

程序) setPassword()setUsername() 等方法都是在BaseRowSet 类中被声明,然后在

CachedRowSet 类中实现了方法的功能。

       2)使用记录集数据填充CachedRowSet 对象

       如何使用记录集的数据填充CachedRowSet 对象呢?一般说来,有三种较为常用的方法。

第一种方法和javax.sql.RowSet 接口所使用的方法如出一辙,设定了CachedRowSet 对象的数据库连接参数以后调用setCommand()方法指定SQL 命令,再使用setXXX()方法设定SQL 命令的输入参数(如果有输入参数的话) 接着就可以使用execute()方法首先利用设

定好的连接参数和数据库建立连接,发送SQL 命令,执行SQL 命令,获取数据库返回的

数据,并用这些数据,填充CachedRowSet 对象的内部记录集结构注意这种方法所使用

execute()方法不带任何参数,第二种方法是首先载入JDBC数据库驱动程序然后与

数据库建立连接创建Connection  接口的实例对象接着用setcommand()方法指定SQL

令,如果存在SQL 输入参数则可以使用setXXX()方法指定IN 参数,一切就绪后,就可

以调用execute()方法,请读者注意此execute()方法非彼execute()方法后面介绍的execute()

方法需要参数参数,就是Connection  接口的实例对象,execute() 方法可以利用这个对象往

数据库发送SQL 命令,并用数据库服务器返回的数据填充CachedRowSet 对象。两个execute()方法的定义如下:      

       public void execute(java.sql.Connection  connection);

       public void execute();

使用记录集数据填充CachedRowSet 对象的第三种方法是:首先载入JDBC数据库驱

动程序,然后分别创建Connection  接口的实例对象,Statement 接口的实例对象接着调用

Statement 对象的execute()方法执行数据库操作,返回一个ResultSet 接口的实例对象,然

后就可以使用CachedRowSet 类的populate()方法将ResultSet 对象的数据填充CachedRowSet

对象内部的记录集结构。populate()方法接受ResultSet 接口的实例对象为方法参数。populate()

方法的定义如下:

       public void populate(java.sql.ResultSet data)

下面是三个JSP 代码段,向读者演示如何使用上述三种方法填充CachedRowSet 对象

内部的记录集结构(防错代码已经省略了,crs CachedRowSet 类的实例对象)

例:方法一

<%

Class.forName("sun.jdbc.odbc.JDBCodbcDriver");

crs.setURL("jdbc:odbc:test");

crs.setUsername("sa");

crs.setPassword("");

crs.setCommand("SELECT * FROM goods");

crs.execute();

%>

例:方法二

<%

Class.forName("sun.jdbc.odbc.JDBCodbcDriver");

Connection  conn=DriverManager ("jdbc:odbc:test","sa","");

crs.setCommand("SELECT * FROM goods");

crs.execute(conn);

%>

例:方法三

<%

Class.forName("sun.jdbc.odbc.JDBCodbcDriver");

Connection  conn=DriverManager ("jdbc:odbc:test","sa","");

Statement  stmt=conn.createStatement ();

ResultSet rs=stmt.executeQuery("SELECT * FROM goods");

crs.populate(rs);

%>

在上面的三个方法中,以第三种方法最为常用读者一定要特别熟悉这种方法。

       获取CachedRowSet 对象内部记录集结构的数据在上面已经介绍了如何用数据库的数据填充CachedRowSet 对象内部记录集结构,那么如何访问这些存储于CachedRowSet 对象内部的数据呢?不用担心,CachedRowSet 类定义了一套getXXX()方法可以获取CachedRowSet 对象内部记录集结构的数据,如getString()

getBlob() getClob()等方法,这些方法的用法和java.sql.ResultSet 接口javax.sql.RowSet 接口的同名方法十分相似,我们在这里就不详细介绍了。读者如果对此感兴趣,可以参考

CachedRowSet 包的说明文档。

CachedRowSet 类可以将内部记录集结构的数据拷贝到RowSet 对象中去有两个方法

可以实现这个功能分别如下所示

       public javax.sql.RowSet createCopy();

       public javax.sql.RowSet createShared();

       这两个方法都返回RowSet 接口的实例对象,初初看起来,这两种方法似乎没有什么

差别,不就是将CachedRowSet 对象的内部数据备份到RowSet 对象中去吗?其实这两个方

法有很大的差别第一个方法仅仅是将CachedRowSet 对象的内部数据备份到RowSet 对象

中,如果后来CachedRowSet 对象所包含的数据发生了变化,例如某个记录的数据被更新

或者被删除了,但是RowSet 对象不会受到任何的影响即RowSet 对象内部记录集的数据

保持原样,没有发生变化。createShare()方法同样将CachedRowSet 对象内部记录集的数据

复制到RowSet 对象中去,这两个对象的数据是共享的如果CachedRowSet 对象修改了内

       CachedRowSet 对象除了可以将内部记录集的数据复制到RowSet 对象上,还可以将数

据复制到Collection 对象上,这需要使用toCollection()方法该方法的定义如下:

       public java.util.Collection toCollection();

       public java.util.Collection toCollection(int column);

       上面的两个方法同名,都返回一个java.util.Collection 对象,第一个方法返回的

Collection 对象含有CachedRowSet 对象内部记录集的全部数据,但是第二个方法需要参数

column(整型) 这个方法仅仅将CachedRowSet 对象内部记录集的第cloumn 列的数据返回,并赋给Collection 对象,而不是返回全部的数据。

 


源码爱好者收集整理(shouce.ren)