Java 中处理 ResultSet 的有效方法
我在 Java 中使用 ResultSet,但不确定如何正确关闭它。我正在考虑使用 ResultSet 构造 HashMap,然后关闭 ResultSet。这种 HashMap 技术是否有效,或者是否有更有效的方法来处理这种情况?我需要键和值,因此使用 HashMap 似乎是一个合理的选择。
如果使用 HashMap 是最有效的方法,那么我如何在代码中构造和使用 HashMap?
这是我尝试过的:
public HashMap resultSetToHashMap(ResultSet rs) throws SQLException {
ResultSetMetaData md = rs.getMetaData();
int columns = md.getColumnCount();
HashMap row = new HashMap();
while (rs.next()) {
for (int i = 1; i <= columns; i++) {
row.put(md.getColumnName(i), rs.getObject(i));
}
}
return row;
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
我改进了 RHT/Brad 女士和 Lestos 答案的解决方案。
我扩展了这两种解决方案,将状态留在发现它的地方。
所以我保存当前的结果集位置并在创建地图后恢复它。
rs 是结果集,它是一个字段变量,因此在我的解决方案片段中不可见。
我将 Brad Ms 解决方案中的特定地图替换为通用地图。
在Lestos解决方案中,我优化了代码。在他的代码中,他必须在 for 循环的每次迭代中查找映射。我将其减少为每次 for 循环迭代仅访问一个数组。因此,程序不得在每个迭代步骤中搜索该字符串键。
i improved the solutions of RHTs/Brad Ms and of Lestos answer.
i extended both solutions in leaving the state there, where it was found.
So i save the current ResultSet position and restore it after i created the maps.
The rs is the ResultSet, its a field variable and so in my solutions-snippets not visible.
I replaced the specific Map in Brad Ms solution to the gerneric Map.
In Lestos solution, i optimized the code. In his code he have to lookup the Maps each iteration of that for-loop. I reduced that to only one array-acces each for-loop iteration. So the program must not seach each iteration step for that string-key.
这是我从谷歌获得的代码,稍作修改 -
Here is the code little modified that i got it from google -
您可以使用下面的示例来运行并了解它的基础知识。非常容易理解的完全可操作的代码/示例。
输出:
You can use below example to run and understand it's basics. Very easy fully operational code/example to understand.
Output :
完成
编辑:现在您已经发布了代码,我对其进行了一些更改。
Done
EDIT: now that you have posted code, I have made a few changes to it.
我刚刚清理了 RHT 的答案以消除一些警告,并认为我会分享。 Eclipse 完成了大部分工作:
I just cleaned up RHT's answer to eliminate some warnings and thought I would share. Eclipse did most of the work:
RHT 几乎拥有它。或者您可以使用 RowSetDynaClass 让其他人做所有的工作:)
RHT pretty much has it. Or you could use a RowSetDynaClass and let someone else do all the work :)
这是我的替代解决方案,我使用的是列表地图,而不是地图列表。
在远程数据库上的 5000 个元素的表上进行测试,两种方法的时间约为 350 毫秒。
this is my alternative solution, instead of a List of Map, i'm using a Map of List.
Tested on tables of 5000 elements, on a remote db, times are around 350ms for eiter method.
有几件事可以增强其他答案。首先,你永远不应该返回一个
HashMap
,它是一个特定的实现。返回一个普通的旧java.util.Map
。但无论如何,这对于这个例子来说实际上是不正确的。您的代码仅将 ResultSet 的最后一行作为(哈希)映射返回。相反,您想要返回一个List
。考虑一下应该如何修改代码来做到这一点。 (或者你可以接受戴夫·牛顿的建议)。A couple of things to enhance the other answers. First, you should never return a
HashMap
, which is a specific implementation. Return instead a plain oldjava.util.Map
. But that's actually not right for this example, anyway. Your code only returns the last row of the ResultSet as a (Hash)Map. You instead want to return aList<Map<String,Object>>
. Think about how you should modify your code to do that. (Or you could take Dave Newton's suggestion).