首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当我的结果集类型仅向前时,为什么我可以使用first()方法?

问当我的结果集类型仅向前时,为什么我可以使用first()方法?
EN

Stack Overflow用户
提问于 2018-07-20 22:27:19
回答 1查看 2.1K关注 0票数 0

在执行JDBC调用时,我使用的是默认的ResultSet。我感到惊讶的是,在使用next()迭代ResultSet之后,我可以调用first()返回到第一行。这并不意味着仅使用前向ResultSet

我的代码非常简单:

代码语言:javascript
复制
  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连接器

代码语言:javascript
复制
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.11</version>
</dependency>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-21 13:50:24

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

对于类型为ResultSet的TYPE_FORWARD_ONLY对象,唯一有效的游标移动方法是next。所有其他游标移动方法都抛出一个SQLException。

但是,请注意,如果整个ResultSet不能保证在内存中,例如,如果我们在滚动ResultSet时使用st.setFetchSize(Integer.MIN_VALUE)“流”ResultSet,那么MySQL连接器/J将不允许我们使用除了.next以外的任何东西,否则我们将得到

代码语言:javascript
复制
com.mysql.jdbc.OperationNotSupportedException: Operation not supported for streaming result sets
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51451130

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档