文档章节

mybatis 返回的 Map 集合不尽人意

learn_more
 learn_more
发布于 2016/11/28 15:44
字数 481
阅读 684
收藏 0

查看了相关博客,需要对结果集拦截处理,如果要这样做的话,那我为什的么不自己对取到结果进行封装呢?因为这种需求很少,返回List要比返回Map的情况多很多,如果我重新包装一下拦截器,那么对于一个新来的人来说由该如何呢?

一般我们需要Map的时候都是 selectOne , 可是为什么 Mybatis 提供返回Map的接口不尽人意呢?看看源代码就知道:

// public class DefaultSqlSession implements SqlSession

@Override

public <K, V> Map<K, V> selectMap(String statement, Object parameter, String mapKey, RowBounds rowBounds) {

final List<? extends V> list = selectList(statement, parameter, rowBounds);

final DefaultMapResultHandler<K, V> mapResultHandler = new DefaultMapResultHandler<K, V>(mapKey,

configuration.getObjectFactory(), configuration.getObjectWrapperFactory(), configuration.getReflectorFactory());

final DefaultResultContext<V> context = new DefaultResultContext<V>();

for (V o : list) {

context.nextResultObject(o);

mapResultHandler.handleResult(context);

}

return mapResultHandler.getMappedResults();

}
// public class DefaultMapResultHandler<K, V> implements ResultHandler<V>

@Override

public void handleResult(ResultContext<? extends V> context) {

final V value = context.getResultObject();

final MetaObject mo = MetaObject.forObject(value, objectFactory, objectWrapperFactory, reflectorFactory);

// TODO is that assignment always true?

final K key = (K) mo.getValue(mapKey);

mappedResults.put(key, value);

}

 

selectMap 首先需要两个参数一个是 statement,一个是mapKey,前者用来查询数据库,得到还是一个 List,然后对 List 的 value 逐个使用 Handler 处理,Handler 的处理方式很简单,首先获取 value,然后在这个value中获取属性为 mapKey的值,最后把这个值作为新的 Map的key,value还是以前的value。说白了,这种就是换汤不换药,实际上还是一个 List ,只是这个 List 用 Map 来存储了。假设我们真想返回一个 Map的话,我想 Map 的变化应该是这样的。

变化之前:

[

{

column1:value1,

column2:value2,

},

{

column1:value3,

column2:value4,

}

]

mybatis变化之后:

{

value1:{

column1:value1,

column2:value2,

},

value3:{

column1:value3,

column2:value4,

}

}

理想变化之后:

{

value1:value2,

value3:value4

}

 

© 著作权归作者所有

learn_more
粉丝 93
博文 240
码字总数 210196
作品 0
深圳
程序员
私信 提问
Mybatis3.3.x技术内幕(十五):Mybatis之foreach批量insert,返回主键id列表(修复Mybatis返回null的bug)

Mybatis在执行批量插入时,如果使用的是for循环逐一插入,那么可以正确返回主键id。如果使用动态sql的foreach循环,那么返回的主键id列表,可能为null,这让很多人感到困惑;本文将分析问题产...

祖大俊
2016/05/13
16.3K
18
mybatis映射问题

如题,关于mybatis映射,我想返回一个Map>这么个集合,mybatis的映射文件怎么写?还原一下场景,现在有个商户类,这个商户下面又有很多相册,但是相册的分类不同,有关于商家美食图片,还有商...

StormMa
2017/02/11
153
1
MyBatis源码分析-1-基础支持层-反射模块-Reflector/ReflectorFactory

本文主要介绍MyBatis的反射模块是如何实现的。 MyBatis 反射的核心类Reflector,下面我先说明它的构造函数和成员变量。具体方法下面详解。 org.apache.ibatis.reflection.Reflector public ...

西瓜1994
2018/10/18
59
0
深入了解MyBatis参数

深入了解MyBatis参数 相信很多人可能都遇到过下面这些异常: "Parameter 'xxx' not found. Available parameters are [...]" "Could not get property 'xxx' from xxxClass. Cause: "The exp......

Liuzh_533
2015/03/02
19.2K
12
Mybatis(二)返回值、表查询

之前对Mybatis有了初步的学习与使用,最近学习ssh发现ssh太重,我个人觉得,像hibernate事务,很多情况下没有使用,而缓存,大部分时候也用不上,需要用到的场景,完全可以自已开发,更轻,而...

什么都不懂的小石
2017/12/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

只需一步,在Spring Boot中统一Restful API返回值格式与统一处理异常

统一返回值 在前后端分离大行其道的今天,有一个统一的返回值格式不仅能使我们的接口看起来更漂亮,而且还可以使前端可以统一处理很多东西,避免很多问题的产生。 比较通用的返回值格式如下:...

晓月寒丶
昨天
59
0
区块链应用到供应链上的好处和实际案例

区块链可以解决供应链中的很多问题,例如记录以及追踪产品。那么使用区块链应用到各产品供应链上到底有什么好处?猎头悬赏平台解优人才网小编给大家做个简单的分享: 使用区块链的最突出的优...

猎头悬赏平台
昨天
28
0
全世界到底有多少软件开发人员?

埃文斯数据公司(Evans Data Corporation) 2019 最新的统计数据(原文)显示,2018 年全球共有 2300 万软件开发人员,预计到 2019 年底这个数字将达到 2640万,到 2023 年达到 2770万。 而来自...

红薯
昨天
65
0
Go 语言基础—— 通道(channel)

通过通信来共享内存(Java是通过共享内存来通信的) 定义 func service() string {time.Sleep(time.Millisecond * 50)return "Done"}func AsyncService() chan string {retCh := mak......

刘一草
昨天
58
0
Apache Flink 零基础入门(一):基础概念解析

Apache Flink 的定义、架构及原理 Apache Flink 是一个分布式大数据处理引擎,可对有限数据流和无限数据流进行有状态或无状态的计算,能够部署在各种集群环境,对各种规模大小的数据进行快速...

Vincent-Duan
昨天
60
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部