(七) 行集

RowSet继承了ResultSet接口,却无需始终保持与数据库的连接。

1.应用场景:
(1)可滚动结果集需要始终与数据库保持连接。即使不进行任何操作,也占用数据库连接,而数据库连接属于稀有资源。在这种情况下我们可以使用行集。
(2)RowSet还适用于将查询结果移动到复杂应用的其他层。因为ResultSet结果集数据结构庞大,且依赖于数据库连接。

2.RowSet实现了如下接口:
(1)CachedRowSet允许在断开连接的状态下执行相关操作。
(2)WebRowSet对象代表了一个被缓存的行集,该行集可以保存为XML文件。该文件可以移动到Web应用的其他层中,只要在该层中使用WebRowSet重新打开该文件即可。
(3)FilteredRowSet和JoinRowSet接口支持对行集的轻量级操作,它们等同于SQL中的SELECT和JOIN操作。上述两个接口的操作对象是存储在行集中的数据,因此运行时无需建立数据库连接。
(4)JdbcRowSet是ResultSet的一个瘦包装器。它从RowSet中继承了get方法和set方法,从而将一个结果集转换成一个"bean"。
以上接口的参考实现在com.sun.rowset包中,它们均以Impl结尾,比如CachedRowSetImpl

3.被缓存的行集

一个被缓存的行集包含了一个结果集中所有的数据。CachedRowSet是ResultSet接口的子接口。所以可以使用ResultSet中的API。
被缓存的行集的优点:断开数据库后连接仍然可以使用行集。

(1)使用一个结果集来填充CachedRowSet对象:

import javax.sql.rowset.CachedRowSet;
ResultSet result = stat.getResultSet();
CachedRowSet crs = new com.sun.rowset.CachedRowSetImpl();
crs.populate(result);
result.isAfterLast() //true 即populate会将ResultSet的光标移动到最后一行之后
conn.close();

 

(2)通过CachedRowSet对象自动创建数据库连接

crs.setUrl("jdbc:derby://localhost:1527/COREJAVA;create=true");
crs.setUsername("dbuser");
crs.setPassword("12345678");
//设置查询命令和所有参数
crs.setCommand("SELECT * FROM test_table where name=?");
crs.setString(1, "a");
//设置 CachedRowSet 对象的页大小
crs.setPageSize(20);
//将查询结果填充到行集
crs.execute();
//获取一下批数据
crs.nextPage();

 

注意:
MySQL提供的Driver不支持通过CachedRowSet创建数据库连接

(3)通过行集修改数据
以上方法可以使用与结果集相同的命令来查看和修改行集中的数据如果修改了行集中的内容,通过调用 crs.acceptChanges(conn) 或crs.acceptChanges() 将修改写回数据库中。第二种方法只有行集中设置了连接数据库所需的信息时才能调用。
注意:
1)因为并非所有的结果集都是可更新的,所以如果是复杂查询的结果,那么就无法将行集数据的修改写回到数据库中。当如果是来自同一张表,那么就可以安全的写回数据。
2)如果是使用结果来填充数据,那么行集就无从获知需要更新的数据的数据库表名,需要调用setTable方法来设置表名。
3)提交时行集会检查行集中的原始值与当前数据库的值是否一致,如果一致,按照修改后的结果覆盖数据库中的数据,否则抛出SyncProviderException异常,且不向数据库写回任何值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值