一、前言
有时候我们在进行Mybatis系统开发的时候,会遇到这样一些需求:期望查询一个表返回的结果是一个map,map的key表示表的一个字段,value则又另一个表的字段表示;比如:一个性别sex,一个对应人数number,其中sex为key,number为value。实现这样的需求有两种方式,一种是静态实现,对应的另一种是动态拦截实现。
二、实现
1、静态实现:指定查询 Mapper 语句的 resultType 为 map 时,返回的结果是一个 Map 列表;比如:
mapper.xml:
<resultMap id="map">
<result property="sex" column="sex"/>
<result property="number" column="number"/>
</resultMap>
<select id="selectSex" resultClass="map">
select sex,count(*) as number from person
</select> java:
/**
* 对某个学校计算校友
*
* @param school
*/
public void countFrends(School school) {
Map<String, HashMap<String, Long>> mapSex = sqlSession .selectMap(SchoolConst.SELECT_SEX, school, SchoolConst.KEY);
if (Utils.checkNotNullAndUnempty(mapSex)) {
if (Utils.checkNotNullAndUnempty(mapSex.get(FEMALE))) {
school.setFemale(mapSex.get(FEMALE).get(SchoolConst.VALUE).intValue());
{color:#000000}}
if (Utils.checkNotNullAndUnempty(mapSex.get(MALE))) {
school.setMale(mapSex.get(MALE).get(SchoolConst.VALUE).intValue());
{color:#000000}}
}
}
mapsex打印效果:{0={sex=0, number=25}, 1={sex=1, number=4}}
很显然查询到的结果格式并不是我们真正想要。原因其实就是mapper先根据条件查询出一个List集合,然后遍历List集合,将对象以Key,Value(为查到的行记录)的形式存入Map中返回。那怎么样可以让 Mybatis 查询出来的结果是一个 Key 为表中某一列的值, Value 为表中另一列的值的 Map 呢?下面介绍一种利用拦截器进行动态拦截返回map的方法。
有时候我们在进行Mybatis系统开发的时候,会遇到这样一些需求:期望查询一个表返回的结果是一个map,map的key表示表的一个字段,value则又另一个表的字段表示;比如:一个性别sex,一个对应人数number,其中sex为key,number为value。实现这样的需求有两种方式,一种是静态实现,对应的另一种是动态拦截实现。
二、实现
1、静态实现:指定查询 Mapper 语句的 resultType 为 map 时,返回的结果是一个 Map 列表;比如:
mapper.xml:
<resultMap id="map">
<result property="sex" column="sex"/>
<result property="number" column="number"/>
</resultMap>
<select id="selectSex" resultClass="map">
select sex,count(*) as number from person
</select> java:
/**
* 对某个学校计算校友
*
* @param school
*/
public void countFrends(School school) {
Map<String, HashMap<String, Long>> mapSex = sqlSession .selectMap(SchoolConst.SELECT_SEX, school, SchoolConst.KEY);
if (Utils.checkNotNullAndUnempty(mapSex)) {
if (Utils.checkNotNullAndUnempty(mapSex.get(FEMALE))) {
school.setFemale(mapSex.get(FEMALE).get(SchoolConst.VALUE).intValue());
{color:#000000}}
if (Utils.checkNotNullAndUnempty(mapSex.get(MALE))) {
school.setMale(mapSex.get(MALE).get(SchoolConst.VALUE).intValue());
{color:#000000}}
}
}
mapsex打印效果:{0={sex=0, number=25}, 1={sex=1, number=4}}
很显然查询到的结果格式并不是我们真正想要。原因其实就是mapper先根据条件查询出一个List集合,然后遍历List集合,将对象以Key,Value(为查到的行记录)的形式存入Map中返回。那怎么样可以让 Mybatis 查询出来的结果是一个 Key 为表中某一列的值, Value 为表中另一列的值的 Map 呢?下面介绍一种利用拦截器进行动态拦截返回map的方法。