我执行JDBC调用时使用默认的ResultSet。我很惊讶在使用next()迭代ResultSet之后,我可以调用first()返回第一行。这不是只使用正向ResultSet吗?

我的代码很简单:

  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>

最佳答案

MySQL Connector / J的默认行为是,一旦调用ResultSet,就会将.executeQuery的所有内容加载到内存中。因此,即使我们的ResultSetTYPE_FORWARD_ONLY,MySQL JDBC开发人员显然还是决定“很好”,并允许我们在这种情况下使用.first.absolute等(因为整个ResultSet在内存,并且随时可用),即使JDBC规范指出


  对于ResultSet类型的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

关于java - 为什么我的结果集类型仅是正向时可以使用first()方法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51451130/

10-15 10:45