mybatis select返回值为map时,选取表字段的两列作为key,value
一:数据格式确定
在做项目时,遇见这样的需求,统计每部部门下的设备数量,因为后台需要对该数据进行二次处理,所以如果dao层返回List
部门编号 | 数量1 | 数量2 | 数量3 |
---|---|---|---|
部门A | 10 | 1 | 9 |
部门B | 20 | 2 | 18 |
在按照此数据格式进行实施的时,发现Map只有 key、value 只能返回两个字段,所有对sql语句进行处理,将其余字段通过 concat(数量1,’,’,数量2,’,’,数量3) 连接,则现在的数据格式为
部门编号 | 数量 |
---|---|
部门A | 10,1,9 |
部门B | 20,2,18 |
在上表中 部门编号代表Map的 key ,数量代表Map的 value
二:XxxMapper.xml 书写
定义resultMap
<resultMap id="mapResultMap" type="HashMap">
<result property="key" column="id" jdbcType="VARCHAR" javaType="java.lang.String" />
<result property="value" column="value" javaType="java.lang.String" jdbcType="VARCHAR" />
</resultMap>
查询语句
注:该mapper中使用的case when 语法进行统计分析,使用concat拼接结果集字段
<select id="selectXxxxNum" resultMap="mapResultMap">
select
id as id ,
concat(count(device_id) ,',',
sum(case when customer_id is not null and customer_id != '' then 1 else 0 end),',',
sum(case when customer_id is null or customer_id = '' then 1 else 0 end) ) as value
from sys_device_info
where is_effective = true
group by id
</select>
ResultHandler.java 书写
package cn.ja.rome.mybatis;
import java.util.HashMap;
import java.util.Map;
import org.apache.ibatis.session.ResultContext;
/**
* 用于转化结果集
*
* @author jiangliuhong
*/
public class ResultHandler implements org.apache.ibatis.session.ResultHandler {
@SuppressWarnings("rawtypes")
private final Map mappedResults = new HashMap();
@SuppressWarnings("unchecked")
@Override
public void handleResult(ResultContext context) {
@SuppressWarnings("rawtypes")
Map map = (Map) context.getResultObject();
mappedResults.put(map.get("key"), map.get("value")); // xml配置里面的property的值,对应的列
}
@SuppressWarnings("rawtypes")
public Map getMappedResults() {
return mappedResults;
}
}
SessionMapper.java 书写
package cn.ja.rome.dao;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.support.SqlSessionDaoSupport;
import org.springframework.stereotype.Repository;
import cn.ja.rome.mybatis.ResultHandler;
/**
* 用于session查询
*
* @author jiangliuhong
*/
@Repository
public class SessionMapper extends SqlSessionDaoSupport {
@Resource
public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
super.setSqlSessionFactory(sqlSessionFactory);
}
/**
* @return
*/
@SuppressWarnings("unchecked")
public Map<String,Object> selectXxxNum(){
ResultHandler handler = new ResultHandler();
//namespace : XxxMapper.xml 中配置的地址(XxxMapper.xml的qualified name)
//.selectXxxxNum : XxxMapper.xml 中配置的方法名称
//this.getSqlSession().select(namespace+".selectXxxxNum", handler);
this.getSqlSession().select(XxxMapper.class.getName()+".selectXxxxNum", handler);
Map<String, Object> map = handler.getMappedResults();
return map;
}
}
运行
配置完成,最后在service中注入SessionMapper
@Autowired
private SessionMapper sessionMapper;
public Map<String,Object> test(){
return sessionMapper.selectXxxNum();
}