mybatis 返回的 Map 集合不盡人意

查看了相關博客,須要對結果集攔截處理,若是要這樣作的話,那我爲什的麼不本身對取到結果進行封裝呢?由於這種需求不多,返回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

}
相關文章
相關標籤/搜索