java - 为什么当我的结果集类型是 forward only 时我可以使用 first() 方法?

标签 java mysql jdbc

当我进行 JDBC 调用时,我使用默认的 ResultSet。我很惊讶在使用 next() 迭代 ResultSet 之后,我可以调用 first() 返回到第一行。这不是说只用forward 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 规范说

For a ResultSet object that is of type TYPE_FORWARD_ONLY, the only valid cursor movement method is next. All other cursor movement methods throw an SQLException.

但是请注意,如果整个 ResultSet不保证在内存中,例如,如果我们使用 st.setFetchSize(Integer.MIN_VALUE) “流式传输”ResultSet当我们滚动浏览它时,MySQL Connector/J 将不允许我们使用除 .next 之外的任何内容。或者我们会得到

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

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

相关文章:

php - VARCHAR 大小限制重要吗?

java - 登录后无法访问数据库

java - session 超时时无法获取 session 作用域 bean

java - 如何定义 ListView 应该使用哪个属性来呈现

java - 如何使用 s3 select 从 Parquet 文件中获取所有列的列表?

java - 在通过 fxml 设置的两个 JavaFX 窗口之间传递值?

mysql - 在ubuntu中安装mysql时获取错误

php - 如果列中没有数据,则将数据插入到列中

java - 使 JDBC 插入查询更快

java - 一次连接所有表还是多个查询?