RowSet的使用
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的使用的更多相关文章
- OAF_开发系列29_实现OAF中批次处理迭代器RowSet/RowSetIterator(案例)
20150814 Created By BaoXinjian
- JAVA基础知识之JDBC——离线RowSet
离线RowSet 如果直接使用ResultSet, 程序在得到ResultSet记录之后需要立即使用,否则一旦关闭Connection就不再可用,要解决这种情况要么将ResultSet的结果转换成Ja ...
- JAVA基础知识之JDBC——RowSet
RowSet概念 在C#中,提供了一个DataSet,可以把数据库的数据放在内存中进行离线操作(读写),操作完成之后再同步到数据库中去,Java中则提供了类似的功能RowSet. RowSet接口继承 ...
- ResultSet,RowSet,OracleCachedRowSet和RowSetMetaData区别及联系
在java主要涉及到数据开发的过程中,我们会和数据库打交道很多,其中使用了数据集比如ResultSet和RowSet,经常使用两种,还有其它的一些,那么这两种的主要区别是什么呢?我们先来看它们引入的方 ...
- 数据库连接不关闭造成的问题以及RowSet的使用
这几天给项目做性能压力测试,发现一个方法压力200之后就会把整个系统弄停掉.仔细检查发现是开发人员调用数据库的写法有问题.用的是spring的jdbcTemplate,在使用回调的时候,在回调里又做了 ...
- RowSet
import java.io.FileInputStream; import java.util.Properties; import javax.sql.rowset.JdbcRowSet; imp ...
- JavaEE JDBC RowSet行集
RowSet行集 @author ixenos 应用背景 1.基于结果集的缺点:在与用户的整个交互过程中,必须始终与数据库保持连接 后果:当用户长时间离开时,数据库连接长时间被占用,而这属于稀缺资源: ...
- 普通结果集ResultSet和离线结果集RowSet(四)
数据库的查询操作会得到一系列数据,JDBC API也提供了相关对象来接收查询结果集. 一.ResultSet java.sql.ResultSet接口表示数据库查询的结果集. JDBC提供以下连接方法 ...
- 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 ...
随机推荐
- centos6.5 源码安装 gtk 环境
解决 No package 'gtk+-2.0′ found问题方法:yum install libgnomeui-devel 执行了上面的,下面的就可以放弃了,yum 大法好 首先 yum 安装下面 ...
- Spring+SpringMVC+MyBatis+easyUI整合优化篇(三)代码测试
日常啰嗦 看到标题你可能会问为什么这一篇会谈到代码测试,不是说代码优化么?前两篇主要是讲了程序的输出及Log4j的使用,Log能够帮助我们进行bug的定位,优化开发流程,而代码测试有什么用呢?其实测试 ...
- js实现哈希表(HashTable)
在算法中,尤其是有关数组的算法中,哈希表的使用可以很好的解决问题,所以这篇文章会记录一些有关js实现哈希表并给出解决实际问题的例子. 第一部分:相关知识点 属性的枚举: var person = { ...
- php Redis常用命令
redis是一个很好的缓存工具,下面我们就来介绍一下他怎么使用 启动 Redis 服务src/redis-server或者src/redis-server redis.conf src/Redis-s ...
- windows环境搭建jira 详解
一.事前准备 1:JDK下载并安装:http://www.oracle.com/technetwork/java/javase/downloads/index.html2:MySQL JDBC连接驱动 ...
- 在jsp中用一数组存储了数据库表中某一字段的值,然后在页面中输出其中的值。
List<String> list = new ArrayList<String>(); String sql = "select userName from us ...
- Linux命令之_Cut(转)
linux之cut用法 cut是一个选取命令,就是将一段数据经过分析,取出我们想要的.一般来说,选取信息通常是针对“行”来进行分析的,并不是整篇信息分析的. (1)其语法格式为:cut [-bn ...
- JDK8-十大新特性-附demo
JDK原计划17年上半年就发版,但未成功发版.才发现JDK8的特性还没总结过,特此总结. 一.十大特性. 1.Lambda表达式 2.Stream函数式操作流元素集合 3.接口新增:默认方法与静态方法 ...
- TaintDroid简介
1.Information-Flow tracking,Realtime Privacy Monitoring.信息流动追踪,实时动态监控. 2.TaintDroid是一个全系统动态污点跟踪和分析系统 ...
- sphinx全文检索引擎
今天刚刚学习了一下,就直接分享上去,有些还没有接触,如果有问题请指正,谢谢 sphinx是什么? Sphinx是一个全文检索引擎.主要为其他应用提供高速.低空间占用.高结果 相关度的全文搜索功能. S ...