ResultSet是使用Jdbc编程的人入门和常用的操作数据库的类,自 JDK1.4开始,易于使用RowSet接口被引入。RowSet 接口扩展了标准java.sql.ResultSet接口。RowSetMetaData 接口扩展了java.sql.ResultSetMetaData 接口。因此,熟悉 JDBCAPI 的开发人员必须学习少数几个新 API 才能使用rowset。此外,与 JDBC ResultSet对象配套使用的第三方软件工具也可以方便地用于rowset。但是在JDK1.4中,只有一个RowSet接口,使得RowSet的使用范围打了折扣。不过 JDK 5.0 定义了5个标准的 JDBCRowSet 接口,并且给出了相应的参考实现,因此可以很方便的使用RowSet接口所提供的功能。

  RowSet对象可以建立一个与数据源的连接并在其整个生命周期中维持该连接,在此情况下,该对象被称为连接的rowset。rowset还可以建立一个与数据源的连接,从其获取数据,然后关闭它。这种 rowset 被称为非连接rowset。非连接 rowset可以在断开时更改其数据,然后将这些更改发送回原始数据源,不过它必须重新建立连接才能完成此操作。相比较java.sql.ResultSet而言,RowSet的离线操作能够有效的利用计算机越来越充足的内存,减轻数据库服务器的负担,由于数据操作都是在内存中进行然后批量提交到数据源,灵活性和性能都有了很大的提高。RowSet默认是一个可滚动,可更新,可序列化的结果集,而且它作为JavaBeans,可以方便地在网络间传输,用于两端的数据同步。

  1、与ResultSet比较

  (1)RowSet扩展了ResultSet接口,因此可以像使用ResultSet一样使用RowSet。

  (2)RowSet扩展了ResultSet接口,因此功能比ResultSet更多、更丰富。

  (3)默认情况下,所有 RowSet 对象都是可滚动的和可更新的。而ResultSet是只能向前滚动和只读的。

  (4)RowSet可以是非链接的,而ResultSet是连接的。因此利用CacheRowSet接口可以离线操作数据。

  (5)RowSet接口添加了对 JavaBeans 组件模型的 JDBC API 支持。rowset 可用作可视化Bean开发环境中的 JavaBeans 组件。

  (6)RowSet采用了新的连接数据库的方法。

  (7)CacheRowSet是可以序列化的。

  (8)RowSet和ResultSet都代表一行行的数据、属性以及相关操作方法。

  (9)自己认为,应该倾向于把RowSet看成是与数据库无关的东西,它只是一个代表一行行数据的对象,而ResultSet则是一个与数据库紧密联系的东西。

  2、JDK 5.0 的5个标准RowSet接口

  在JDK5.0中,5个标准RowSet接口包括CachedRowSet,WebRowSet,FilteredRowSet,JoinRowSet和JdbcRowSet。相应的参考实现是Sun公司给出的,位于com.sun.rowset包下,分别为为CachedRowSetImpl,WebRowSetImpl,FilteredRowSetImpl,JoinRowSetImpl和JdbcRowSetImpl。这5个标准接口中JdbcRowSet是链接的rowset,而其他4个是非链接的rowset。

  (1)CachedRowSet:最常用的一种RowSet。其他三种RowSet(WebRowSet,FilteredRowSet,JoinRowSet)都是直接或间接继承于它并进行了扩展。它提供了对数据库的离线操作,可以将数据读取到内存中进行增删改查,再同步到数据源。CachedRowSet是可滚动的、可更新的、可序列化,可作为JavaBeans在网络间传输。支持事件监听,分页等特性。CachedRowSet对象通常包含取自结果集的多个行,但是也可包含任何取自表格式文件(如电子表格)的行。

  (2)WebRowSet:继承自 CachedRowSet,并可以将 WebRowSet 写到 XML文件中,也可以用符合规范的XML 文件来填充 WebRowSet。

  (3)FilteredRowSet:通过设置 Predicate(在javax.sql.rowset包中),提供数据过滤的功能。可以根据不同的条件对 RowSet 中的数据进行筛选和过滤。

  (4)JoinRowSet:提供类似 SQL JOIN 的功能,将不同的 RowSet 中的数据组合起来。目前在 Java6中只支持内联(Inner Join)。

  (5)JdbcRowSet:对 ResultSet 的一个封装,使其能够作为 JavaBeans被使用,是唯一一个保持数据库连接的RowSet。JdbcRowSet 对象是连接的 RowSet 对象,也就是说,它必须使用启用JDBC 技术的驱动程序(“JDBC驱动程序”)来持续维持它与数据源的连接。

  3、填充RowSet

  前面说过,应该倾向于把RowSet看成是与数据库无关而只代表一行行数据的对象,因此就涉及到数据从哪里来的问题。

  (1)从数据库直接获取数据

  由于大部分情况下,与数据打交道也就是与数据库打交道,因此RowSet接口提供了通过JDBC直接从数据库获取数据的方法,以参考实现JdbcRowSetImpl为例,就是这样:

 RowSet rs = new JdbcRowSetImpl();//也可以是 CachedRowSetImpl,    WebRowSetImpl,FilteredRowSetImpl,JoinRowSetImpl。
  rs.setUrl("jdbc:mysql:///test");
  rs.setUsername("root");
  rs.setPassword("");
  rs.setCommand("SELECT * FROM EMPLOYEES");
  rs.execute();

  设置好相关属性,运行execute()方法后,EMPLOYEES表中的数据就被填充到rs对象中了。

  除了通过设置JDBC连接URL、用户名和密码外,RowSet也可以使用数据源名称属性的值来查找已经在命名服务中注册的DataSource对象。完成检索后,可以使用DataSource对象创建到它所表示的数据源的连接,设置数据源名称可以使用setDataSourceName()方法。

  (2)用ResultSet填充

  在有现成ResultSet的情况下,如果想将其作为RowSet使用;或者当DBMS不提供对滚动和更新的完全支持时,如果想使不可滚动和只读的 ResultSet对象变得可滚动和可更新,可以创建一个使用该ResultSet 对象的数据所填充的 CachedRowSet 对象。

  ResultSet rs = stmt.executeQuery("SELECT * FROM EMPLOYEES");
  CachedRowSet crs = newCachedRowSetImpl();//也可以是WebRowSetImpl,FilteredRowSetImpl,JoinRowSetImpl,因为他们均继承自CachedRowSetImpl
  crs.populate(rs);

  运行populate()方法后,ResultSet对象rs中的数据就被填充到crs对象中了。

  (3)用XML填充

  如果您打算将XML作为数据交换格式在客户端和你的服务器之间传输数据并且向实现数据离线编辑、或者向使用XML格式的数据的话,可以使用WebRowSet接口来用XML填充数据。

 WebRowSet wrs = new WebRowSetImpl();
wrs.readXml(new FileReader(new File("D:\\employees.xml")));

  运行readXml()方法后,employees.xml文件的数据就被填充到wrs对象中了。employees.xml文件的格式参见附录。

  (4)用其他方法填充

  如果形用其他方式填充,比如csv、excel、text、http等格式或方法填充数据,那么就需要自己编写代码实现RowSet。

  4、操作RowSet中的数据及元数据

  除了ResultSet提供的操作数据和元数据方法外,RowSet接口没有提供太多额外的方法。

  1)更新数据

   rs.absolute();
  rs.updateInt(, );
  rs.updateInt(, );
  rs.updateString(, "John");
  rs.updateRow();

  (2)插入数据

  rs.moveToInsertRow();
  rs.updateInt(, );
  rs.updateInt(, );
  rs.updateString(, "John");
  rs.insertRow();

  (3)删除数据

    rs.absolute();
rs.deleteRow();

  (4)设置属性

     rs.setCommand("select id, salary, name from employees where id=?");
  rs.setInt(, );
  rs.execute();

  (5)元数据  

     RowSetMetaData rsmd = (RowSetMetaData)rs.getMetaData();
  int count = rsmd.getColumnCount();
  int type = rsmd.getColumnType();

  5、事务与更新底层数据源

  RowSet本身只代表具体数据,事务以及底层数据源的更新是与底层数据源密切相关的概念。对于JDBC数据源,相应的标准接口JdbcRowSet通过与数据库相关的方法来来实现,如commit(),rollback()等。对于标准接口的中非连接rowset,如CachedRowSet,则在对RowSet中的数据改动后,通过运行acceptChanges()方法,在内部调用RowSet对象的 writer 将这些更改写入数据源,从而将 CachedRowSet 对象中的更改传播回底层数据源。

  6、可序列化非连接RowSet

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

  由于 CachedRowSet 对象是非连接的,所以和具有相同数据的ResultSet对象相比更为简洁。因此,它特别适于向瘦客户端(如 PDA)发送数据,这种瘦客户端由于资源限制或安全考虑而不适于使用JDBC驱动程序。所以 CachedRowSet 对象可提供一种“获取各行”的方式而无需实现全部 JDBC API。

  WebRowSet继承自CachedRowSet,除了拥有CachedRowSet的优点外,还可以将WebRowSet输出成XML,也可以将XML转换成WebRowSet,更加适合在Web环境中使用。标准的WebRowSetXML 模式定义位于URIhttp://java.sun.com/xml/ns/jdbc/webrowset.xsd。将WebRowSet保存为XML的代码事例如下

     wrs.setCommand("select id, salary, name from employees");
  wrs.execute();
  wrs.writeXml(new FileWriter(new File("D:\\employees.xml")));

RowSet的使用的更多相关文章

  1. OAF_开发系列29_实现OAF中批次处理迭代器RowSet/RowSetIterator(案例)

    20150814 Created By BaoXinjian

  2. JAVA基础知识之JDBC——离线RowSet

    离线RowSet 如果直接使用ResultSet, 程序在得到ResultSet记录之后需要立即使用,否则一旦关闭Connection就不再可用,要解决这种情况要么将ResultSet的结果转换成Ja ...

  3. JAVA基础知识之JDBC——RowSet

    RowSet概念 在C#中,提供了一个DataSet,可以把数据库的数据放在内存中进行离线操作(读写),操作完成之后再同步到数据库中去,Java中则提供了类似的功能RowSet. RowSet接口继承 ...

  4. ResultSet,RowSet,OracleCachedRowSet和RowSetMetaData区别及联系

    在java主要涉及到数据开发的过程中,我们会和数据库打交道很多,其中使用了数据集比如ResultSet和RowSet,经常使用两种,还有其它的一些,那么这两种的主要区别是什么呢?我们先来看它们引入的方 ...

  5. 数据库连接不关闭造成的问题以及RowSet的使用

    这几天给项目做性能压力测试,发现一个方法压力200之后就会把整个系统弄停掉.仔细检查发现是开发人员调用数据库的写法有问题.用的是spring的jdbcTemplate,在使用回调的时候,在回调里又做了 ...

  6. RowSet

    import java.io.FileInputStream; import java.util.Properties; import javax.sql.rowset.JdbcRowSet; imp ...

  7. JavaEE JDBC RowSet行集

    RowSet行集 @author ixenos 应用背景 1.基于结果集的缺点:在与用户的整个交互过程中,必须始终与数据库保持连接 后果:当用户长时间离开时,数据库连接长时间被占用,而这属于稀缺资源: ...

  8. 普通结果集ResultSet和离线结果集RowSet(四)

    数据库的查询操作会得到一系列数据,JDBC API也提供了相关对象来接收查询结果集. 一.ResultSet java.sql.ResultSet接口表示数据库查询的结果集. JDBC提供以下连接方法 ...

  9. sql server2008 搭建链接服务器成功后查询时报Cannot obtain the schema rowset "DBSCHEMA_TABLES_INFO" for OLE DB provider "SQLNCLI10" for linked server "XXXXX". 的解决方法

    这是由于链接的数据库服务器的版本与本地数据库服务器不一致,有人说要升到sp3,sp4,然后在执行什么语句之类的 我觉得太繁琐了,通过网上查询之后看到可以这么做: USE master GRANT EX ...

随机推荐

  1. Cobbler自动化部署最佳实践

    第1章 Cobbler自动化部署最佳实践 运维自动化在生产环境中占据着举足轻重的地位,尤其是面对几百台,几千台甚至几万台的服务器时,仅仅是安装操作系统,如果不通过自动化来完成,根本是不可想象的. 面对 ...

  2. C#调用webbrowser,阻止弹出新HTML页面

    参考资料: 1.C#调用webbrowser,阻止弹出新IE窗口 http://www.cnblogs.com/blindman/p/3819649.html 2.[WPF]监听WPF的WebBrow ...

  3. JSAAS的Activiti会签开发扩展处理

    1.什么是会签? 在流程业务管理中,任务是通常都是由一个人去处理的,而多个人同时处理一个任务,这种任务我们称之为会签任务.这种业务需求很常见,如一个请款单,领导审批环节中,就需要多个部门领导签字.在流 ...

  4. Android Studio查找功能(搜索功能)及快捷键

    版权声明:本文为博主原创文章,未经博主允许不得转载. 1.在当前窗口查找文本[Ctrl+F] F3                  向下查找关键字出现位置 Shift+F3        向上一个关 ...

  5. HTML基础学习(二)—CSS

    一.CSS概述     CSS(Cascading Stytle Sheets)层叠样式表,用来定义网页的显示效果.可以解决HTNL代码对样式定义的重复,提高了后期样式代码的可维护性,并增强了网页的显 ...

  6. MySQL意外关闭, 导致软件崩溃而无法启动的解决办法

    在初次搭建XAMPP,Apache和MySQL都可以正常启动,一旦关机重启XAMPP时,发现Apache可以正常启动:而MySQL却不能正常运行,会碰到 Error: MySQL shutdown u ...

  7. org.gradle.api.internal.tasks.DefaultTaskInputs$TaskInputUnionFileCollection cannot be cast to org.gradle.api.internal.file.collections.DefaultConfigurableFileCollection

    转载请注明出处:http://www.cnblogs.com/cnwutianhao/p/6709758.html Android Studio导入项目报错: org.gradle.api.inter ...

  8. 使用点击二分图计算query-document的相关性

    之前的博客中已经介绍了Ranking Relevance的一些基本情况(Click Behavior,和Text Match):http://www.cnblogs.com/bentuwuying/p ...

  9. 关于binary log一点总结[转]

    阅读目录(Content) 1 what's binary log 2 Binary Logging Options and Variables 2.1 基础参数 3 Binary Logging F ...

  10. [USACO11NOV]牛的障碍Cow Steeplechase

    洛谷传送门 题目描述: 给出N平行于坐标轴的线段,要你选出尽量多的线段使得这些线段两两没有交点(顶点也算),横的与横的,竖的与竖的线段之间保证没有交点,输出最多能选出多少条线段. 因为横的与横的,竖的 ...