mybatis 返回的 Map 集合不尽人意

MyBatis Map 结果转换
探讨了MyBatis提供的Map结果集转换方法,并对比了实际需求与理想情况之间的差异。作者通过源代码分析,解释了MyBatis如何将查询结果从List转换为Map,并指出了现有实现的局限性。

查看了相关博客,需要对结果集拦截处理,如果要这样做的话,那我为什的么不自己对取到结果进行封装呢?因为这种需求很少,返回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

}

 

转载于:https://my.oschina.net/heweipo/blog/795526

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值