mybatis select返回值为map时,选取表字段的两列作为key,value

mybatis select返回值为map时,选取表字段的两列作为key,value

一:数据格式确定

在做项目时,遇见这样的需求,统计每部部门下的设备数量,因为后台需要对该数据进行二次处理,所以如果dao层返回List格式的数据则后台需要对该数据进行遍历,而如果只返回Map数据的话,则会使得后台代码简洁,并且提高程序效率。即需要返回这样的数据格式:

部门编号 数量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

  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" />  
   

查询语句

注:该mapper中使用的case when 语法进行统计分析,使用concat拼接结果集字段

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 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 map = handler.getMappedResults();  
        return map;
    }
}

运行

配置完成,最后在service中注入SessionMapper

@Autowired
private SessionMapper sessionMapper;
public Map test(){
    return sessionMapper.selectXxxNum();
}

你可能感兴趣的:(java,mysql)