【发布时间】:2014-08-20 12:45:12
【问题描述】:
在 java 中,我会执行以下操作来迭代 resultset 并形成查询,
public Map<String, List<MODEL>> fun(){
Map<String, List<MODEL>> map = new TreeMap<String, List<MODEL>>();
LinkedHashSet<String> set = new LinkedHashSet<String>();
String sql = "select distinct(column) from table where conditions orderby column ";
ResultSet rslt = stmt.executeQuery(sql);
while (rslt.next()) {
al.add(rslt.getString(1));
}
for (String s : al) {
List<MODEL> list = new ArrayList<MODEL>();
String sql2 = "select * from table where column="+s;
ResultSet rslt2 = stmt.executeQuery(sql2);
while (rslt2.next()) {
MODEL obj = new MODEL();
// set values to setters from resultset
list.add(obj);
}
map.put(s, list);
}
return map;
}
我使用单独查询的原因是,我将不同的值添加到地图键中,并将它们的对应值(作为列表)添加到地图的值中。注意 (结果它具有 column1 的重复值),但我需要将它们存储为映射键,从而使其成为唯一的。 我也需要它的所有相关值,所以填充一个列表
如何使用JdbcTemplate 实现相同的功能,
提前致谢
【问题讨论】:
-
您正在做的事情对于常规 JDBC 代码来说不是一个好主意!性能受到重复查询数据库的影响。您最好使用连接查询,然后提取相关数据。不用说,像您建议的那样使用 RowMapper 将您的 JDBC 代码传输到 Spring 会更糟。 RowMapper 应该是一个创建 DTO 的哑对象。仅此而已
-
是的,我知道,但仅此要求就有上述机会。而且我确信第一个查询将只包含 3 到 4 个结果。这样就不会导致性能问题。有没有办法使用spring jdbc来做到这一点?
-
即使考虑到我正在将我的结果集添加到集合中并再次对其进行迭代
-
我强烈建议将两个查询合并为一个查询
select * from table where column in (select distinct(column) from table),然后您可以使用RowMapper映射实际结果。您现在正在执行 5 个查询而不是 5 个查询并简化了您的代码。 -
一个观察:您的查询让 SQL 注入攻击。在查询
+rs.getString(1)中附加一些东西是一种不好的做法,请改用setParameter方法。 JdbcTemplate 支持这样做。
标签: java sql spring resultset jdbctemplate