管理结果集、java7的RowSet 1.1

管理结果集

JDBC使用ResultSet 来封装执行查询得到的查询结果,然后通过移动ResultSet的记录指针来取出结果集的内容。除此之外,JDBC还允许通过ResultSet 来更新记录,并提供了ResultSetMetaData 来获得ResultSet对象的相关信息。
可以使用absolute()、 previous()、 afterLast()等方 法自由移动记录指针的ResultSet被称为可滚动的结果集
Java5以后默认打开的ResultSet就是可滚动的
以默认方式打开的ResultSet是不可更新的,如果希望创建可更新的ResultSet,则必须在创建Statement或PreparedStatement时传入额外的参数。Connection在创建Staterment 或PreparedStatement时还可额外传入如下两个参数:
1.resultSetType: 控制ResultSet的类型
2.resultSetConcurrency: 控制ResultSet的并发类型
可更新的结果集还需要满足如下两个条件:
1.所有数据都应该来自一个表
2.选出的数据集必须包含主键列
Blob列通常用于存储大文件如:图片或声音文件,他们必须使用特殊的方法来存储
所以将Blob数据插入数据库需要使用PreparedStatement,该对象有一个方法:setBinaryStream(int parameterIndex, InputStream x),该方法可以为指定参数传入二进制输入流,从而可以实现将Blob数据保存到数据库的功能。
当需要从ResultSet里取出Blob数据时,可以调用ResultSet的getBlob(int columnIndex)方法,该方法将返回一个Blob对象,Blob对象提供了getBinaryStream(方法来获取该Blob数据的输入流,也可以使用Blob对象提供的getBytes(方法直接取出该Blob对象封装的二进制数据。

使用ResultSetMetaData分析结果集
ResultSet里包含一个getMetaData(方法,该方法返回该ResultSet对应的ResultSetMetaData 对象。一旦获得了ResultSetMetaData对象,就可通过ResultSetMetaData提供的大量方法来返回ResultSet的描述信息。常用的方法有如下三个:
1.int getColumnCount():返回该ResultSet的列数量。
2.String getColumnName(int column):返回指定索引的列名。
3.int getColumnType(int column):返回指定索引的列类型。

java7的RowSet 1.1

RowSet继承了ResultSet 接口, RowSet接口下包含JdbcRowSet、CachedRowSet、FilteredRowSet、JoinRowSet和WebRowSet常用子接口。除了JdbcRowSet需要保持与数据库的连接之外,其余4个子接口都是离线的RowSet,无须保持与数据库的连接。
在这里插入图片描述
JdbcRowSetImpl 提供了如下常用构造器:
1.JdbcRowSetImpl0: 创建一- 个默认的JdbcRowSetImpl对象。
2.JdbcRowSetImpl(Connection conn): 以给定的Connection 对象作为数据库连接来创建JdbcRowSetImpl对象。
3.JdbcRowSetImpl(ResultSet rs):创建一个包装 ResultSet对象的JdbcRowSetImpl对象。
在这里插入图片描述

使用JdbcRowSetImpl坏处:
1.程序直接与JdbcRowSetImpl实现类耦合,不利于后期的升级、扩展。
2.JdbcRowSetImpl实现类不是一一个公开的API,未来可能被删除。
所以RowSet未广泛应用,Java7新增了RowSetProvider类和RowSetFactory 接口,其中RowSetProvider 负责创建RowSetFactory, 而RowSetFactory则提供了如下方法来创建RowSet实例:
1.CachedRowSet createCachedRowSet():创建一个默认的CachedRowSet。
2.FilteredRowSet createFilteredRowSet():创建一个默认的FilteredRowSet。
3.JdbcRowSet createJdbcRowSet():创建一个默认的JdbcRowSet。
4.JoinRowSet createJoinRowSet():创建一个默认的JoinRowSet。
5.WebRowSet createWebRowSet():创建-一个默认的WebRowSet。

通过使用RowSetFactory,就可以把应用程序与RowSet实现类分离开,避免直接使用JdbcRow SetImpl等非公开的API,也更有利于后期的升级、扩展。

离线RowSet
假设应用程序架构被分为两层:数据访问层和视图显示层,当应用程序在数据访问层查询得到ResultSet之后,对ResultSet的处理有如下两种常见方式:
1.使用迭代访问ResultSet 里的记录,并将这些记录转换成Java Bean,再将多个Java Bean封装成一个List集合,也就是完成“ResultSet->JavaBean集合”的转换。转换完成后可以关闭Connection等资源,然后将JavaBean集合传到视图显示层,视图显示层可以显示查询得到的数据。
2.直接将ResultSet传到视图显示层一这 要求当视图显示层显示数据时,底层Connection必须一直处于打开状态,否则ResultSet无法读取记录。
第一种安全,但编程复杂,第二种不安全

由于CachedRowSet 会将数据记录直接装载到内存中,因此如果SQL查询返回的记录过大,CachedRowSet将会占用大量的内存,在某些极端的情况下,它甚至会直接导致内存溢出。为了解决该问题,CachedRowSet 提供了分页功能。所谓分页功能就是一次只装载ResultSet 里的某几条记录,这样就可以避免CachedRowSet占用内存过大的问题。CachedRowSet提供了如下方法来控制分页:
1.populate(ResultSet rs, int startRow):使用给定的ResultSet 装填RowSet,从ResultSet 的第startRow条记录开始装填。
2.setPageSize(int pageSize): 设置CachedRowSet每次返回多少条记录。
3.previousPage(): 在底层ResultSet可用的情况下,让CachedRowSet读取上一页记录。
4.nextPage(): 在底层ResultSet可用的情况下,让CachedRowSet读取下一页记录。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值