mybatis select返回值為map時,選取表欄位的兩列作為key,value

ja_rome發表於2017-03-17

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

  <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();
}

相關文章