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中編寫