到目前为止,所有的 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()
用法注释
可卷动 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()
。请考虑潜在的(笔者有此教训)结果。