可卷动结果集ResultSet分页

到目前为止,所有的 ResultSet 都已经以连续的方式进行了运 用,从头至尾使用 ResultSet.next() 获取各行。如在语句、 ResultSet 和与数据库互动中介绍的,在本课程自始至终也可以看 到, ResultSet 是通过语句获取的,通常使用 executeQuery 方法。到现在为止,语句的创建都是使用

stmt = con.createStatement();
该方法是 JDBC 1.0 中唯一可用的方法。在 JDBC 2.0 中,存在着允许创建可卷 动和/或可更新的 ResultSet 新方法。
createStatement( 
   int resultSetType, 
   int resultSetConcurrency )
resultSetType 可以是

ResultSet.TYPE_FORWARD_ONLY--这是默认值,和 JDBC 1.0 中的一样:仅转 交移动,列一般地仅能读取一次。在 ResultSet.next() 返回 false 时, ResultSet 数据就不再有效并自动关 闭。

ResultSet.TYPE_SCROLL_INSENSITIVE 允许创建 ResultSet, 其中的光标可以向后、向前和随机移动。这是静态数据:数据库中对当前 ResultSet 中选定的行进行的任何更改都是不可见的。也就是说, ResultSet 对数据修改不敏感。

ResultSet.TYPE_SCROLL_SENSITIVE 允许创建 ResultSet,其 中的光标可以向后、向前和随机移动。这提供了数据的动态视图:数据库中对当 前 ResultSet 中选定的行进行的任何更改都是可见的。也就是说, ResultSet 对数据修改很敏感。

resultSetConcurrency 可以是

ResultSet.CONCUR_READ_ONLY - 这是默认值,和 JDBC 1.0中的一样:

ResultSet.CONCUR_UPDATABLE 允许通过新的 ResultSet 方法 和定位性能对编程数据进行更改。

可更新的 ResultSet 优点、缺点都有,本课程不作深入讨论。 更多的信息,请查看 Java 教程或 JDBC 教程和 参考资料(第二版)联机版本中高级教程的第 3.3 部分。

 

注意,已请求的 ResultSet 类型,即使受到驱动程序的支持, 也可能无法返回。如果出现该情况,驱动程序会在连接时发出 SQLWarning。 另外, DatabaseMetaData.supportsResultSetType() 可用于确定 驱动程序支持的 ResultSet类型, ResultSet.getType() 提供实际返回的 ResultSet 的类型。详情请查看请 求未支持的特性

可卷动的 ResultSet 的获取方式如任何其他的一样,通常都是 通过 Statement.executeQuery() 进行。不过,有了 ResultSet, 就可以使用以下方法:

 

absolute()

afterLast()

beforeFirst()

first()

getRow()

isAfterLast()

isBeforeFirst()

isFirst()

isLast()

last()

moveToCurrentRow()--仅对可更新的 ResultSet 有效。

moveToInsertRow()--仅对可更新的 ResultSet 有效。

previous()

relative()

这些方法的详情请查看 ResultSet

 

用法注释

 

可卷动 ResultSets 的驱动程序性能和但实现级别会变化,有 时很显著。请检查文档。下面是在使用可卷动的 ResultSets 时应 考虑的其他几个因素,但决不是全部。

可卷动的 ResultSet,正如不可卷动的 ResultSet 一样,检索时定位在第一行前。

所有的行检索时,语句才视为完成。这在 ResultSet.next() 检索最后一行时发生。一些驱动程序在 autocommit 开启时将此视为联锁该语句。 结果, ResultSet 会关闭,并在下一个访问尝试时给出 SQLException。 为了可移植性,请将 autocommit 设置为 false。

ResultSet.getRow() 会在某些(甚至全部)位置返回零。这尤 其意味着,使用已赋值的 ResultSet.last()ResultSet.getRow() 序列在数据库中(甚至在同一数据库的驱动程序中)获取的行数不太可靠。

ResultSet.absolute() 在传递零时会给出 SQLException

ResultSet.relative() 不会更改光标的位置。不过,至少一 个供应商会不检查零值而从 ResultSet.absolute() 中调用 ResultSet.relative()。请考虑潜在的(笔者有此教训)结果。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值