MyBatis將查詢出的兩列數據裝配成鍵值對的操作方法
描述:
MyBatis 直接查詢出的格式是 List 套 Map 的結構,當然利用 Stream 流進行轉換也非常便捷,但如果這樣的操作很多的話,不如利用 MyBatis 提供的 ResultHandler 接口進行實現,做成工具類使用。
此外,如果用 MyBatis 提供的 @MapKey ,也隻是對應值有冗餘,因為 MapKey取一個字段為鍵,取出的所有字段為值。
操作:
1. 實現 ResultHandler 接口
/** * 用於MyBatis查詢庫表中兩列映射為鍵值對 */ @Component public class MapResultHandler implements ResultHandler { private final HashMap mapResults = new HashMap<String,String>(); private String key; private String value; @Override public void handleResult(ResultContext resultContext) { HashMap map = (HashMap)resultContext.getResultObject(); mapResults.put(map.get("key"), map.get("value")); } /** * 返回映射 * @return 結果 */ public HashMap getMapResults() { return mapResults; } /** * @param key key * @param value value */ public MapResultHandler(String key, String value) { this.key = key; this.value = value; } /** * 空構造 */ public MapResultHandler() { } }
2. 對應 DAO 層
對應 mapper 查詢接口中,在查詢的方法裡將 ResultHandler 實現類(MapResultHandler)以參數形式傳入。
由於使用實現類拿取裝配好的Map,此處的返回類型為 void 。
/** * 提取<圖片名,創建時間>的Map,對應創建時間進行處理 * @param imageLength 上傳圖片的個數 * @return */ void selectImageNameAndCreatetime(MapResultHandler mapResultHandler, int imageLength);
對應 xml 文件中,定義返回類型為 map 。
其中註意給我們需要的鍵值取別名,對應別名與 ResultHandler 實現類(MapResultHandler)中定義的相對應,這樣在ResultHandler 實現類(MapResultHandler)中 map.get() 才能取到。
<select id="selectImageNameAndCreatetime" resultType="map"> select name as 'key',time as 'value' from house_pic_info order by id desc limit #{imageLength} </select>
3. 使用
先實例化 ResultHandler 實現類(MapResultHandler),作為參數傳入。
取 Map 時依然從 ResultHandler 實現類(MapResultHandler)中取。
MapResultHandler handler = new MapResultHandler(); housePicInfoMapper.selectImageNameAndCreatetime(handler, length); Map imageMap = handler.getMapResults();
思考:對應 ResultHandler 接口隻需實現一個 handleResult 方法,在 MyBatis 中 @MapKey 的實現也應該是有對應實現。
/** * MyBatis 中 DefaultMapResultHandler 實現 * @author Clinton Begin */ public class DefaultMapResultHandler<K, V> implements ResultHandler<V> { private final Map<K, V> mappedResults; private final String mapKey; private final ObjectFactory objectFactory; private final ObjectWrapperFactory objectWrapperFactory; private final ReflectorFactory reflectorFactory; @SuppressWarnings("unchecked") public DefaultMapResultHandler(String mapKey, ObjectFactory objectFactory, ObjectWrapperFactory objectWrapperFactory, ReflectorFactory reflectorFactory) { this.objectFactory = objectFactory; this.objectWrapperFactory = objectWrapperFactory; this.reflectorFactory = reflectorFactory; this.mappedResults = objectFactory.create(Map.class); this.mapKey = mapKey; } @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); } public Map<K, V> getMappedResults() { return mappedResults; } }
到此這篇關於MyBatis將查詢出的兩列數據裝配成鍵值對的文章就介紹到這瞭,更多相關MyBatis查詢數據裝配成鍵值對內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- mybatis中返回多個map結果問題
- sql查詢返回值使用map封裝多個key和value實例
- mybatis返回map結果集@MapKey使用的場景分析
- mybatis/mybatis-plus模糊查詢語句特殊字符轉義攔截器的實現
- 詳解mybatis流式查詢與分頁插件