在TYPE_FORWARD_ONLY ResultSet 中可以调用absolute 函数移动到前面的行吗?

Can absolute function be called for moving at rows ahead in TYPE_FORWARD_ONLY ResultSet?

从 JAVA 7 API https://docs.oracle.com/javase/7/docs/api/java/sql/ResultSet.html#absolute(int) 我们得到:

"SQLException - if a database access error occurs; this method is called on a closed result set or the result set type is TYPE_FORWARD_ONLY"

但是JAVASE 8 II认证书放在第10章(JDBC),练习18:

String sql = "select name from animal order by id";
try (Connection conn = DriverManager.getConnection("jdbc:derby:zoo");
    Statement stmt = conn.createStatement();
    ResultSet rs = stmt.executeQuery(sql)) {
    rs.absolute(0);

按照书上的回答,没有异常。那么,有没有可能在一个TYPE_FORWARD_ONLY ResultSet中用absolute函数向前移动呢?

不,您不能指望它会起作用,并且根据对 JDBC 的严格解释,对于 TYPE_FORWARD_ONLY 结果集,驱动程序这样做甚至是不正确的。

javadoc 明确表示 ResultSet#absolute(int):

Throws:
SQLException - if a database access error occurs; this method is called on a closed result set or the result set type is TYPE_FORWARD_ONLY

这并不意外。想一想,如果您先调用 absolute(5),然后对真实的 TYPE_FORWARD_ONLY 结果集调用 absolute(1),会发生什么情况。第一个会成功而第二个调用不会:这是不一致的行为,应该避免。

所以那本书中的代码是错误的,作者依赖(可能甚至不知道)用于静默升级 TYPE_FORWARD_ONLYTYPE_SCROLL_INSENSITIVE 的特定数据库驱动程序(这是一些驱动程序在做什么 - 例如 - 自动提交)。