您好,登录后才能下订单哦!
这篇文章将为大家详细讲解有关Java中RowSet如何使用,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
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接口
在JDK 5.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 中的数据组合起来。目前在 Java 6 中只支持内联(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 = new CachedRowSetImpl(); //也可以是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(5);
rs.updateInt(1, 10);
rs.updateInt(2, 1000);
rs.updateString(3, "John");
rs.updateRow();
(2)插入数据
rs.moveToInsertRow();
rs.updateInt(1, 10);
rs.updateInt(2, 1000);
rs.updateString(3, "John");
rs.insertRow();
(3)删除数据
rs.absolute(5);
rs.deleteRow();
(4)设置属性
rs.setCommand("select id, salary, name from employees where id = ?");
rs.setInt(1, 1);
rs.execute();
(5)元数据
RowSetMetaData rsmd = (RowSetMetaData)rs.getMetaData();
int count = rsmd.getColumnCount();
int type = rsmd.getColumnType(2);
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。
关于Java中RowSet如何使用就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。