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

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

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

额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. 支持跨域的html元素

    image javascript iframe link

  2. 笔记70 Spring Boot快速入门(八)(重要)

    上传文件 一.方式一 1.上传页面 upLoadPage.html <!DOCTYPE html> <html lang="en"> <head> ...

  3. Bootstrap 过渡效果

    <!DOCTYPE html> <html <!DOCTYPE html> <html lang="en"> <head> & ...

  4. hibernate 双向1对多

    1: 还是用客户Customer和订单Order来解释: “一对多”的物理意义:一个客户可以有多个订单,某个订单只能归宿于一个客户. “双向”的物理意义:客户知道自己有哪些订单,订单也知道自己归宿于哪 ...

  5. SQL语句之-通配符

    四.用通配符过滤数据 1.LIKE模糊搜索 2.%0个1个多个字符 SELECT * FROM products WHERE prod_name LIKE 'Fish%' 区分大小写,任意位置,任意次 ...

  6. ARM系列处理器的分类

    1.ARM ARM即以英国ARM(Advanced RISC Machines)公司的内核芯片作为CPU,同时附加其他外围功能的嵌入式开发板,用以评估内核芯片的功能和研发各科技类企业的产品. ARM ...

  7. 「2020 新手必备 」极速入门 Retrofit + OkHttp 网络框架到实战,这一篇就够了!

    老生常谈 什么是 Retrofit ? Retrofit 早已不是什么新技术了,想必看到这篇博客的大家都早已熟知,这里就不啰嗦了,简单介绍下: Retrofit 是一个针对 Java 和 Androi ...

  8. 【SQL】链接服务器

    最近做项目,需要对两个数据库进行同步操作,所以采用在Server SQL中建立链接服务器方式实现. 链接服务器,可以直接访问/操作其他服务器上的数据库表. 1.连接SQL Server链接服务器 EX ...

  9. python模块学习之testlink (自动回写测试案例执行结果到testlink)

    安装 pip install TestLink-API-Python-client #!/usr/bin/env Python # -*- coding: utf-8 -*- ''' Created ...

  10. Nginx网络架构实战学习笔记(一):Nginx简介、安装、信号控制、nginx虚拟主机配置、日志管理、location 语法、Rewrite语法详解

    文章目录 nginx简介 nginx安装 nginx信号控制 nginx虚拟主机配置 日志管理 location 语法 精准匹配的一般匹配 正则匹配 总结 Rewrite语法详解 nginx简介 Ng ...