java - 为什么当我的结果集类型仅向前时我可以使用 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>
解决方案
MySQL Connector/J 的默认行为是在调用时立即将其全部内容加载ResultSet
到内存中.executeQuery
。因此,即使我们ResultSet
是TYPE_FORWARD_ONLY
MySQL JDBC 开发人员显然决定“很好”并允许我们在这种情况下使用.first
,.absolute
等(因为整个ResultSet
都在内存中并且随时可用),即使 JDBC 规范说
对于
ResultSet
type 的对象,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
推荐阅读
- xcode - 由于未定义的符号,Xcode 构建失败:__swift_FORCE_LOAD__$_swiftUIKit
- c - 手动将简单 .csv 文件中的数据导入为 uint64_t
- reactjs - Next.js:在静态导出期间向页面传递额外的道具?
- javascript - 如何对齐 li 标签内的单选按钮
- python - 如何根据显示分辨率在pygame中缩放字体大小?
- javascript - 使用 Node.js 将 pdf 文件上传到 Google Cloud Storage
- javascript - 如何获取表中具有相同类选择器的所有行?
- docker - docker-compose 是否支持将扩展字段环境变量与服务声明合并?
- vba - 仅将格式应用于替换文本的一部分
- c# - 使用范围报告设置 Klov,显示构建但没有可用的项目