MyBatis返回Map

栏目: Java · 发布时间: 5年前

内容简介:有时候我们做查询, 只需要返回两个string类型的字段,方便我们后续的处理.比如根据商品的code查询对应的分类的名字,需要返回一个map, key为商品code, value为商品分类对应的名称.以方便我们后续对结果集的处理.如果你直接用mybatis返回一个map, 你可能会发现,结果根据不是自己需要的.这时候我们需要自己实现一个ResultHandler来实现我们想要的结果,废话不多说,直接上代码第一步,在mapper.xml文件当中,定义一个ResultMap这个map当中的property的定

有时候我们做查询, 只需要返回两个string类型的字段,方便我们后续的处理.比如根据商品的code查询对应的分类的名字,需要返回一个map, key为商品code, value为商品分类对应的名称.以方便我们后续对结果集的处理.如果你直接用mybatis返回一个map, 你可能会发现,结果根据不是自己需要的.这时候我们需要自己实现一个ResultHandler来实现我们想要的结果,废话不多说,直接上代码

第一步,在mapper.xml文件当中,定义一个ResultMap

    <resultMap id="cateNameMapping" type="java.util.HashMap" >
        <result property="key" column="commodityCode"></result>
        <result property="value" column="cateName"></result>
    </resultMap>

这个map当中的property的定义,是我们在定义ResultHandler的时候,需要用到的.column是我们做 sql 查询的时候 mysql 中字段的名称,注意这里不支持驼峰自动映射,比如我这里写了commodityCode, 后面需要用AS来处理一下.

第二步正常的在我们的mapper.xml中写查询语句

<select id="processCateNameMappingByGoodsCodes" parameterType="java.util.List" resultMap="cateNameMapping">
        SELECT
               c.commodity_code AS commodityCode,
               CONCAT(tc.cate_name,',',tc1.cate_name, ',', tc2.cate_name) AS cateName
        FROM
             t_commodity c LEFT JOIN t_category tc ON c.commodity_first_id = tc.id
                           LEFT JOIN t_category tc1 ON c.commodity_second_id = tc1.id
                           LEFT JOIN t_category tc2 ON c.commodity_third_id = tc2.id
        WHERE
            c.commodity_code IN
                <foreach collection="list" separator="," open="(" close=")" item="code">
                    #{code}
                </foreach>
    </select>

注意返回类型为ResultMap, 也就是我们上面定义的那个.

第三步 自定义一个ResultHandler

package org.linuxsogood.es.statistical.handler;
 
import org.apache.ibatis.session.ResultContext;
import org.apache.ibatis.session.ResultHandler;
 
import java.util.HashMap;
import java.util.Map;
 
/**
 * @author honway
 * @date 2018/10/22 11:49.
 * @blog http://linuxsogood.org
 */
public class MapResultHandler implements ResultHandler {
 
    private final Map<String ,String> mappedResults = new HashMap();
 
    @Override
    public void handleResult(ResultContext resultContext) {
        Map<String ,String> m = (Map) resultContext.getResultObject();
        mappedResults.put(m.get("key"), m.get("value"));
    }
 
    public Map getMappedResults() {
        return mappedResults;
    }
}

第四步 就是使用了, 我们在service层, 利用spring的自动注入,来注入mybatis的sqlSession

@Service
public class GoodsSalesServiceImpl implements IGoodsSalesService {
 
    private final GoodsSalesMapper goodsSalesMapper;
    private final SqlSession sqlSession;
 
    @Autowired
    public GoodsSalesServiceImpl(GoodsSalesMapper goodsSalesMapper, SqlSession sqlSession) {
        this.goodsSalesMapper = goodsSalesMapper;
        this.sqlSession = sqlSession;
    }
 
    /**
     * 根据商品code查询商品的一二三级分类
     * @param commodityCodeList 商品code
     * @return 返回商品和分类的映射, key为商品code, value为商品的一二三级分类,用逗号隔开
     */
    @Override
    public Map<String, String> processCateNameMappingByGoodsCodes(List<String> commodityCodeList) {
        MapResultHandler handler = new MapResultHandler();
        sqlSession.select("com.tramy.es.statistical.dao.GoodsSalesMapper.processCateNameMappingByGoodsCodes",commodityCodeList ,handler);
        return handler.getMappedResults();
    }
}

使用sqlSession的select方法,第一个参数是mapper.xml文件当中定义的select的命名空间, 第二个参数是需要传入的参数,如果没有可以不要这个参数.第三个是我们自定义的handler, 这样就能返回我们要的map结果了.


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Mobilizing Web Sites

Mobilizing Web Sites

Layon, Kristofer / 2011-12 / 266.00元

Everyone has been talking about the mobile web in recent years, and more of us are browsing the web on smartphones and similar devices than ever before. But most of what we are viewing has not yet bee......一起来看看 《Mobilizing Web Sites》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具