mybatisgroupby分组查询:将返回结果封装为map
⽂章⽬录
1. 最简单但性能最差的做法
在逻辑层分多次对数据库进⾏查询。伪代码如下。
List<String> nameList ;
List<Integer> countList;
for(String name: nameList){
countList.untByName(name));
}
map⽂件如下。
<select>
select cout(*) from ** where name=#{name};
</select>
这样写起来很简单,但是反复建⽴与数据库的连接,效率极差。
2. 使⽤group by分组查询,将查询结果封装成类
为了提⾼性能,使⽤数据库中 group by 的语法,直接进⾏分组查询,并定义⼀个类接受查询结果。
//结果类
public class result{
private String key;
private String value;
//省略getter和setter
}
map⽂件如下。
<resultMap type="com.**.result" id="result">…</resultMap>
<select resuleMap="result">
select name as key , count(*) as value group by name;
</select>
然后再对List进⾏处理,这样效率⽐第⼀种⽅法⾼,但是建⽴result对象会有⼀定内存消耗,对类进⾏处理也并不⽅便。
groupby分组
直接封装为map?
<select id="getDepNumMap" resultType="java.util.HashMap">
select department_id , count(*)
from staff_career_info
where status = 'enable'
group by department_id;
</select>
想⽤上⾯这样的代码直接将查询结果封装到map中是不可以的。返回结果如下:
可见,这样得到的map中将column的名字作为了key,结果作为value。⽽且,如果有多个分组也只会返回⼀个分组。List<HashMap<String,Object>>
正确的做法如下。
//Dao
List<HashMap<String,Object>> getDepNumMap();
//map⽂件
<select id="getDepNumMap" resultType="java.util.HashMap">
select department_id as 'key', count(*) as 'value'
from staff_career_info
where status = 'enable'
group by department_id;
</select>
然后再将得到的list 转化为map。这⾥的⽅法要⾃⼰写。
//转换⽅法
List<HashMap<String, Object>> list = DepNumMap(); Map<String, Integer> map = new HashMap<>();
if (list != null && !list.isEmpty()) {
for (HashMap<String, Object> hashMap : list) {
String key = null;
Integer value = null;
for (Map.Entry<String, Object> entry : Set()) {
if ("key".Key())) {
key = (String) Value();
} else if ("value".Key())) {
//我需要的是int型所以做了如下转换,实际上返回的object应为Long。
value = ((Value()).intValue();
}
}
map.put(key, value);
}
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论