Java:连接关闭后使用 ResultSet 时出错
尝试使用 JDBC 从 MySQL 数据库检索数据时,用户可能会遇到以下错误: “java.sql.SQLException:结果集关闭后不允许执行操作。”当底层连接关闭后尝试使用 ResultSet 对象时,会发生这种情况。
说明
JDBC 基于延迟加载的概念进行操作,其中结果在请求之前不会完全检索查询。 ResultSet 对象在结果上提供了一个光标,允许您迭代它们。但是,关闭创建 ResultSet 的连接也会关闭游标,使其无法使用。
解决方案
要避免此错误,必须保持连接打开,直到不再需要 ResultSet 或使用不同的方法。
一种推荐的方法是使用行映射器将结果集转换为对象集合。此方法封装了转换过程,即使在连接关闭后也允许您访问结果:
<code class="java">public static List<T> sqlquery(String query, RowMapper<T> rowMapper) throws SQLException { try (Connection connection = DriverManager.getConnection(...); Statement st = connection.createStatement(); ResultSet rs = st.executeQuery(query)) { List<T> list = new ArrayList<>(); while (rs.next()) { list.add(rowMapper.mapRow(rs)); } return list; } }</code>
此修改后的代码使用 try-with-resources 来确保连接、语句和结果集方法完成时自动关闭,消除了忘记手动关闭它们的可能性。此外,它使用行映射器将结果集中的每一行转换为填充对象,然后可以将其收集到列表中。
结论
通过理解借助 JDBC 的延迟加载机制并利用行映射器,开发人员可以有效地从数据库检索数据,同时避免连接关闭后与关闭结果集相关的错误。
以上是为什么我在 Java JDBC 中收到'java.sql.SQLException: ResultSet 关闭后不允许操作”?的详细内容。更多信息请关注PHP中文网其他相关文章!