当我执行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>
答案 0 :(得分:3)
MySQL Connector / J的默认行为是在调用ResultSet
时将.executeQuery
的全部内容加载到内存中。因此,即使我们的ResultSet
是TYPE_FORWARD_ONLY
,MySQL JDBC开发人员显然还是决定要“好”,并允许我们在这种情况下使用.first
,.absolute
等(因为整个ResultSet
都在内存中并且随时可用),即使JDBC规范说
对于类型为
ResultSet
的{{1}}对象,唯一有效的游标 移动方式为TYPE_FORWARD_ONLY
。所有其他光标移动方法都抛出一个next
。
但是请注意,如果不能保证整个SQLException
都在内存中,例如,如果我们在滚动浏览ResultSet
时使用st.setFetchSize(Integer.MIN_VALUE)
来“流式传输”,那么MySQL Connector / J将不允许我们使用ResultSet
以外的任何东西,否则我们会得到
.next