首页 > 解决方案 > 为什么当我的结果集类型仅向前时我可以使用 first() 方法?

问题描述

ResultSet在进行 JDBC 调用时使用默认值。我很惊讶在使用next()迭代之后ResultSet,我可以调用first()回到第一行。这不意味着只使用 forwardResultSet吗?

我的代码很简单:

  Statement st = conn.createStatement();
  rs = st.executeQuery(sql);

while (rs.next()) {
    for (int i = 1; i <= columnsNumber; i++) {
        if (i > 1) System.out.print(",  ");
        String columnValue = rs.getString(i);
        System.out.print(rsmd.getColumnName(i) + " : " + columnValue);
    }
    System.out.println("");
}
rs.first();

我正在使用 8.0.11 版本的 mysql 连接器

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.11</version>
</dependency>

标签: javamysqljdbc

解决方案


MySQL Connector/J 的默认行为是在调用时立即将其全部内容加载ResultSet到内存中.executeQuery。因此,即使我们ResultSetTYPE_FORWARD_ONLYMySQL JDBC 开发人员显然决定“很好”并允许我们在这种情况下使用.first,.absolute等(因为整个ResultSet都在内存中并且随时可用),即使 JDBC 规范说

对于ResultSettype 的对象,TYPE_FORWARD_ONLY唯一有效的光标移动方法是next. 所有其他光标移动方法都会抛出 SQLException.

但是请注意,如果ResultSet不能保证整个都在内存中,例如,如果我们在滚动浏览它时使用st.setFetchSize(Integer.MIN_VALUE)“流式传输” ResultSet,那么 MySQL Connector/J 不会让我们使用任何东西,.next否则我们会得到

com.mysql.jdbc.OperationNotSupportedException: Operation not supported for streaming result sets

推荐阅读