当我进行 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
叫做。所以,即使我们的 ResultSet
是TYPE_FORWARD_ONLY
MySQL JDBC 开发人员显然决定“友善”并允许我们使用 .first
, .absolute
等等(因为整个 ResultSet
在内存中并且随时可用),即使 JDBC 规范说
For a
ResultSet
object that is of typeTYPE_FORWARD_ONLY
, the only valid cursor movement method isnext
. All other cursor movement methods throw anSQLException
.
但是请注意,如果整个 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/