zoukankan      html  css  js  c++  java
  • mybatis group by查询返回map类型

    故事的发生是这样的. . . . . . .

    一天 我发现我们的页面显示了这样的汇总统计数据,看起来体验还不错哦~~

    然后,我发现代码是这样滴:分开每个状态分别去查询数量。

    额e,可是为嘛不使用简单便捷的 group by 语句呢

    我们知道MyBatis提供了selectMap的方法,查询结果为hashmap。查询的时候,可以配置相应的传入参数和查询返回结果。

    对应dao 层代码如下:

    //查询各状态对应的数量,三个参数分别对应,select的id,查询参数,返回hashmap的key
       public Map<String, Map<String,Integer>>  sumStatusByParam(SearchParam searchParam ){
           return (Map<String, Map<String,Integer>>)sqlSessionTemplate.selectMap(SEARCH_NAME_SPACE + "sumStatusByParam",searchParam,"status");
       }
     

    对应mybatis的数据查询语句:

    <!-- 查询各状态对应的数量 -->
        <select id="sumStatusByParam" parameterType="com.selicoco.model.dto.param.SearchParam" resultType="hashmap">
            select status as status,count(id) as num
            from selicoco_order
            where 1=1
            <if test="name != null" >
                and name like concat('%',#{name,jdbcType=VARCHAR},'%')
            </if>
            group by status;
        </select>
    </mapper>

    最后得到的结果是这样的。

    我以为这样就可以了,但是,count(1)这样出来的结果是一个Long类型,并不能直接转换成Integer,虽然查询的时候并没有报错,但是读取的时候一定会告诉你转换失败的,

    所以我只能默默的把map里面的 Integer转换成Long类型。

    对于这样的结果,我们如果要获取的话,得这样去取

    map.get("WAIT_CONFIRM").get("num");

    这样其实是比较费力的。明白其中的原理其实可以写一个公用的中间层方法,将里面的map转换出来。因为我的状态并不多,所以直接就使用上面的方式去取值了。

    selectMap实现机制:

    selectMap调用selectList进行查询,返回一个List<hashMap>,mybatis底层查询返回其实都是hashMap。

    然后再从map里面取出我们指定的key值,放入一个map<key,value>,而value就是底层查询出来的整个hashmap的值。

    源码如下:

    public Map selectMap(String statement, String mapKey) {
       return selectMap(statement, null, mapKey, RowBounds.DEFAULT);
     }
     public Map selectMap(String statement, Object parameter, String mapKey) {
       return selectMap(statement, parameter, mapKey, RowBounds.DEFAULT);
     }
     public Map selectMap(String statement, Object parameter, String mapKey, RowBounds rowBounds) {
       final List list = selectList(statement, parameter, rowBounds);
       final DefaultMapResultHandler mapResultHandler = new DefaultMapResultHandler(mapKey);
       final DefaultResultContext context = new DefaultResultContext();
       for (Object o : list) {
         context.nextResultObject(o);
         mapResultHandler.handleResult(context);
       }
       return mapResultHandler.getMappedResults();
     }
     public List selectList(String statement) {
       return selectList(statement, null);
     }
     public List selectList(String statement, Object parameter) {
       return selectList(statement, parameter, RowBounds.DEFAULT);
     }
     public List selectList(String statement, Object parameter, RowBounds rowBounds) {
       try {
         MappedStatement ms = configuration.getMappedStatement(statement);
         return executor.query(ms, wrapCollection(parameter), rowBounds, Executor.NO_RESULT_HANDLER);
       } catch (Exception e) {
         throw ExceptionFactory.wrapException("Error querying database.  Cause: " + e, e);
       } finally {
         ErrorContext.instance().reset();
       }
     }
    public DefaultMapResultHandler(String mapKey) {
      this.mapKey = mapKey;
    }
    public void handleResult(ResultContext context) {
      final Object value = context.getResultObject();
      final MetaObject mo = MetaObject.forObject(value);
      final Object key = mo.getValue(mapKey);
      mappedResults.put(key, value);
    }
     

    想要返回一个对象可以参考:http://www.denghuafeng.com/post-238.html

  • 相关阅读:
    【leetcode_medium】78. Subsets
    【opencv基础】随机颜色生成
    【leetcode_easy_array】1566. Detect Pattern of Length M Repeated K or More Times
    XSSFSheet对象的格式设置(转)
    Devexpress控件使用技巧
    Visual Studio 2017社区版安装C++开发环境(转)
    DevExpress GridControl添加选择框的两种方法
    DevExpress GridControl使用教程:之 添加 checkbox 复选框(转)
    DevExpress中GridControl中实现checkbox多行选中(转)
    C#开发WinForm窗体程序时,如何在子窗体中关闭窗口时并退出程序?(转)
  • 原文地址:https://www.cnblogs.com/selinamee/p/6995037.html
Copyright © 2011-2022 走看看