Mybatis查詢結果為兩列時, 結果保存為key-value的map


mybatis查詢結果為map時,出來的結果默認是下面這樣的

[{
   key: 1,
   value: 'xx'     
},
{
   key: 2,
   value: 'xxx'
}]

我們想要的是這樣的:

{
    1 : 'xx',
    2 : 'xxx'
}

如果自己轉換的話非常麻煩。經過一番查找,發現mybatis可以在查詢出來的時候通過修改handler自動轉換

先寫一個Handler繼承ResultHandler

package;

import org.apache.ibatis.session.ResultContext;
import org.apache.ibatis.session.ResultHandler;

import java.util.HashMap;
import java.util.Map;

public class MapResultHandler implements ResultHandler {
    @SuppressWarnings("rawtypes")
    private final Map mappedResults = new HashMap();

    @SuppressWarnings("unchecked")
    @Override
    public void handleResult(ResultContext context) {
        @SuppressWarnings("rawtypes") Map map = (Map) context.getResultObject();
        // xml配置中通過resultMap配置的property
        mappedResults.put(map.get("key"), map.get("value"));
    }

    @SuppressWarnings("rawtypes")
    public Map getMappedResults() {
        return mappedResults;
    }
}

 

Mapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.coreDB.NationnalityCodeMapper">
  <resultMap id="BaseResultMap" type="com.coreDB.NationnalityCodePO">
    <id column="NATIONALITY_CODE" jdbcType="VARCHAR" property="nationalityCode" />
    <result column="NATIONALITY_DESC" jdbcType="VARCHAR" property="nationalityDesc" />
  </resultMap>

  <resultMap id="mapResult" type="HashMap">
  <!-- 這里的property需要與handler中map.get的名稱對應 -->
<result property="key" column="NATIONALITY_CODE" javaType="java.lang.String"/> <result property="value" column="NATIONALITY_DESC" javaType="java.lang.String" /> </resultMap>

<select id="selectAllMap" resultMap="mapResult"> select NATIONALITY_CODE, NATIONALITY_DESC from T_NATIONALITY_CODE </select> </mapper>

 

需要查詢時,不使用原來的mapper接口,新建一個查詢類,使用@Repository注入並且繼承SqlSessionDaoSupport,從而可以獲取SqlSession對象

import MapResultHandler; import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.support.SqlSessionDaoSupport; import org.springframework.stereotype.Repository; import javax.annotation.Resource; import java.util.Map; @Repository public class MapSessionMapper extends SqlSessionDaoSupport { @Resource public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) { super.setSqlSessionFactory(sqlSessionFactory); } public Map<String, String> selectCountryMap() { MapResultHandler handler = new MapResultHandler(); this.getSqlSession().select(NationnalityCodeMapper.class.getName() + ".selectAllMap", handler); Map<String, String> map = handler.getMappedResults(); return map; } }

NationnalityCodeMapper

@Mapper
public interface NationnalityCodeMapper { //這里不需要寫接口,因為改造后的方法是通過MapSessionMapper來調用的 }

 

調用方式如上,通過獲取SqlSession來調用sql並使用我們自己定義的handler解析結果,selectAllMap是我這里的業務方法名稱,sql實現依舊在XML中編寫

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM