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

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

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

额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

mybatis group by查询返回map类型的更多相关文章

  1. MyBatis中Mapper的返回值类型

    insert.update.delete语句的返回值类型 对数据库执行修改操作时,数据库会返回受影响的行数. 在MyBatis(使用版本3.4.6,早期版本不支持)中insert.update.del ...

  2. ResultMap和ResultType在使用中的区别、MyBatis中Mapper的返回值类型

    在使用mybatis进行数据库连接操作时对于SQL语句返回结果的处理通常有两种方式,一种就是resultType另一种就是resultMap,下面说下我对这两者的认识和理解 resultType:当使 ...

  3. LINQ查询返回DataTable类型

    个人感觉Linq实用灵活性很大,参考一篇大牛的文章LINQ查询返回DataTable类型 http://xuzhihong1987.blog.163.com/blog/static/267315872 ...

  4. 【ibatis】IBatis返回map类型数据

    有时侯不想创建javabean,或者污染现有的javaBean对象,就需要返回Map类型的数据对象: 1)最简单的方法就是将查询到的字段,使用""进行引起来,这样就可以返回map类 ...

  5. Hibernate应用SQL查询返回实体类型

    Hibernate应用SQL查询返回实体类型 Hibernate使用SQL查询返回实体类型 以前,使用SQL查询,结果放在 RS 结果集中,还要去转换影射到Java类中.Hibernate中,可以自动 ...

  6. LINQ查询返回DataTable类型[轉]與将DataTable序列化为Json格式【轉】

    (原文地址:http://xuzhihong1987.blog.163.com/blog/static/26731587201101853740294/) LINQ查询返回DataTable类型 在使 ...

  7. mybatis返回map类型数据空值字段不显示的解决方法

    在日常开发中,查询数据返回类型为map,数据库中有些自动值为null,则返回的结果中没有值为空的字段,则如何显示值为空的字段呢? Spring boot + MyBatis返回map中null值默认不 ...

  8. MyBatis探究-----返回Map类型数据

    1.使用@MapKey @MapKey:告诉mybatis封装Map的时候使用哪个属性作为Map的key Map<K, V>:键是这条记录的主键key,值是记录封装后的javaBean 1 ...

  9. HQL查询——查询返回对象类型分析

    关于HQL查询,我们可以结合hibernate的API文档,重点围绕org.hibernate.Query接口,分析其方法,此接口的实例对象是通过通过session.对象的creatQuery(Str ...

随机推荐

  1. 转载:php excel 的处理

    下面是总结的几个使用方法 include 'PHPExcel.php'; include 'PHPExcel/Writer/Excel2007.php'; //或者include 'PHPExcel/ ...

  2. PHP- 搜索插入位置

    给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引.如果目标值不存在于数组中,返回它将会被按顺序插入的位置. 你可以假设数组中无重复元素. 示例 1: 输入: [1,3,5,6], 5输出 ...

  3. div标准布局示例

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  4. ubuntu 搜狗输入法内存占用太多,卡顿不够处理办法

    1.  输入 free -m  查看是否内存不够导致卡顿 2. 输入  gnome-system-monitor 打开ubuntu 任务管理器 找到搜狗输入法结束进程 3. 完美解决

  5. CascadeCNN人脸检测结构

    模型的结构大致由图可以完整展现,三个分类是否人脸的12.24.48net,再加上三个用于修正预测框的分类网络: 这三个分类是否人脸的网络,结构逐渐变复杂, 由上图可以看出,前2阶的网络都非常简单,只有 ...

  6. react app相关知识

    1.快速新建名为hello-world项目的应用命令 npx create-react-app hello-world 2.使用serve来mock数据 ①先安装serve        npm i ...

  7. Python--反射(重点)、面向对象内置方法:如__str__、面向对象的软件开发

    复习: Python3统一了类与类型 类的名称空间在定义阶段产生,看名称空间:类.__dict__ Python3特点:可以多继承 Python3都是新式类 继承意义:解决重复代码   组合:也是解决 ...

  8. 【dart学习】-- Dart之异步编程

    一,概述 编程中的代码执行,通常分为同步与异步两种. 同步:简单说,同步就是按照代码的编写顺序,从上到下依次执行,这也是最简单的我们最常接触的一种形式.但是同步代码的缺点也显而易见,如果其中某一行或几 ...

  9. Xcode5 统计单元测试覆盖率(仅限XCTest)

    概要 通过本篇文章,你将学会如何在Xcode5下使用统计XCTest测试代码的覆盖率,以及如何快速得到测试覆盖率的图形化报表. 为什么要特别说明Xcode5下的代码覆盖率统计,原因是,以前的方法在新环 ...

  10. Angular 2 技能图谱skill-map

    # Angular 2 技能图谱 ## 模块 ### 自定义模块 - 根模块 - 特性模块 - 共享模块 - 核心模块 ### 内置模块 - ApplicationModule 模块 - Common ...