当前位置:首页 > 数据库 > mysql 返回map类型数据

mysql 返回map类型数据

2022年11月06日 13:51:28数据库25

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

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

mysql 返回map类型数据 _ JavaClub全栈架构师技术笔记

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

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

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

mysql 返回map类型数据 _ JavaClub全栈架构师技术笔记

对应dao 层代码如下:

//查询各状态对应的数量,三个参数分别对应,select的id,查询参数,返回hashmap的key

public Map>sumStatusByParam(SearchParam searchParam ){return (Map>)sqlSessionTemplate.selectMap(SEARCH_NAME_SPACE + "sumStatusByParam",searchParam,"status");

}

对应mybatis的数据查询语句:

select status as status,count(id) asnumfromselicoco_orderwhere 1=1

and name like concat('%',#{name,jdbcType=VARCHAR},'%')

group bystatus;

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

mysql 返回map类型数据 _ JavaClub全栈架构师技术笔记

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

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

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

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

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

selectMap实现机制:

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

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

源码如下:

publicMap selectMap(String statement, String mapKey) {return selectMap(statement, null, mapKey, RowBounds.DEFAULT);

}publicMap selectMap(String statement, Object parameter, String mapKey) {returnselectMap(statement, parameter, mapKey, RowBounds.DEFAULT);

}publicMap selectMap(String statement, Object parameter, String mapKey, RowBounds rowBounds) {final List list =selectList(statement, parameter, rowBounds);final DefaultMapResultHandler mapResultHandler = newDefaultMapResultHandler(mapKey);final DefaultResultContext context = newDefaultResultContext();for(Object o : list) {

context.nextResultObject(o);

mapResultHandler.handleResult(context);

}returnmapResultHandler.getMappedResults();

}publicList selectList(String statement) {return selectList(statement, null);

}publicList selectList(String statement, Object parameter) {returnselectList(statement, parameter, RowBounds.DEFAULT);

}publicList selectList(String statement, Object parameter, RowBounds rowBounds) {try{

MappedStatement ms=configuration.getMappedStatement(statement);returnexecutor.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();

}

}

publicDefaultMapResultHandler(String mapKey) {this.mapKey =mapKey;

}public voidhandleResult(ResultContext context) {final Object value =context.getResultObject();final MetaObject mo =MetaObject.forObject(value);final Object key =mo.getValue(mapKey);

mappedResults.put(key, value);

}

作者:weixin_39883462
来源链接:https://blog.csdn.net/weixin_39883462/article/details/113974748

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。


本文链接:https://www.javaclub.cn/database/68195.html

分享给朋友:

“mysql 返回map类型数据” 的相关文章

一文带你了解MySQL基础

目录 一,为什么要学习数据库 二,数据库的相关概念 2.1数据库术语...

MySQL面试有这一篇就够了

MySQL面试有这一篇就够了

MySQL面试常见知识点 1、 MySQL常用的存储引擎有什么?它们有什么区别? InnoDB InnoDB是MySQL的默认存储引擎,支持事务、行锁和外键等操作。 MyISAM MyISAM是M...

MySQL事务和锁

MySQL事务和锁

1.事务 1.什么是事务? 事务: 要么全部成功,要么全部失败 事务是数据库管理系统(DBMS)执行过程中的一个 逻辑单位 ,由一个 有限的数据库操作序列 组成。 逻辑单位:最小的操作单位,不可再分割。 有限的数据库操作序列:...

MySQL主从复制

MySQL主从复制 文章目录 MySQL主从复制 1.准备工作 2.主库的配置 3.配置从库 4.Sharding-JDBC框架的使用...

cloudera-scm-server启动出现Error creating bean with name 'entityManagerFactoryBean'与HHH010003: JDBC Driver class not found: com.mysql.jdbc.Driver错误解决办法(图文详解)

cloudera-scm-server启动出现Error creating bean with name 'entityManagerFactoryBean'与HHH010003: JDBC Driver class not found: com.mysql.jdbc.Driver错误解决办法(图文详解)

     不多说,直接上干货!       问题详情 2017-07-31 22:19:40,342 INFO main:com.cloudera.server.cmf.Main: Starting SCM Serv...

mysql查询最后一条记录

首先要确定什么是最后一条。 是编辑时间最新的为最后一条,还是某个字段数字最大的未最后一条。 比如以时间最大为最后一条,则将符合条件的资料都筛选出来,再按时间排序,再取一笔资料。 SQL如下: select a,b from table whe...

MYSQL查询某字段为空的数据

where  XXX is NULL!! 没错就是这样     拓展:查询某字段不为空的数据 where  XXX != '' 作者:Idiot_2018 来源链接:https://...

mysql字段值中带空格、mysql查询参数带空格的查询方法

问题描述 当我们在使用mysql查询的时候,如果数据库中的这个字段的值含有空格(字符串内部,非首尾),或者我们查询的参数中间有空格,而字段值中没有空格。那么我们很有可能就什么都查不到。 假如有下面的一张表content:...

mysql查询各分区数据量大小

SELECT PARTITION_NAME,TABLE_ROWS FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_NAME = 'table';   作者:雨夜青草 来源链接:https://blog.c...

MySql 查询两张表的数据差别

select * from tb_a A where A.ID NOT IN(select B.ID from tb_b B ); select * from tb_a A where NOT EXISTS (select 1 from...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。