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配置里面的property的值,对应的列
mappedResults.put(map.get("key"), map.get("value"));
}
@SuppressWarnings("rawtypes")
public Map getMappedResults() {
return mappedResults;
}
}
需要查询时,不使用原来的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; } }
调用方式如上,通过获取SqlSession来调用sql并使用我们自己定义的handler解析结果,selectAllMap是我这里的业务方法名称,sql实现依旧在XML中编写