查看了相关博客,须要对结果集拦截处理,若是要这样作的话,那我为什的么不本身对取到结果进行封装呢?由于这种需求不多,返回List要比返回Map的状况多不少,若是我从新包装一下拦截器,那么对于一个新来的人来讲由该如何呢?java
通常咱们须要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 的变化应该是这样的。json
变化以前:mybatis
[ { column1:value1, column2:value2, }, { column1:value3, column2:value4, } ]
mybatis变化以后:app
{ value1:{ column1:value1, column2:value2, }, value3:{ column1:value3, column2:value4, } }
理想变化以后:ide
{ value1:value2, value3:value4 }