MyBatis將查詢出的兩列數(shù)據(jù)裝配成鍵值對的操作方法
描述:
MyBatis 直接查詢出的格式是 List 套 Map 的結構,當然利用 Stream 流進行轉換也非常便捷,但如果這樣的操作很多的話,不如利用 MyBatis 提供的 ResultHandler 接口進行實現(xiàn),做成工具類使用。
此外,如果用 MyBatis 提供的 @MapKey ,也只是對應值有冗余,因為 MapKey取一個字段為鍵,取出的所有字段為值。
操作:
1. 實現(xiàn) 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 實現(xiàn)類(MapResultHandler)以參數(shù)形式傳入。
由于使用實現(xiàn)類拿取裝配好的Map,此處的返回類型為 void 。
/**
* 提取<圖片名,創(chuàng)建時間>的Map,對應創(chuàng)建時間進行處理
* @param imageLength 上傳圖片的個數(shù)
* @return
*/
void selectImageNameAndCreatetime(MapResultHandler mapResultHandler, int imageLength);對應 xml 文件中,定義返回類型為 map 。
其中注意給我們需要的鍵值取別名,對應別名與 ResultHandler 實現(xiàn)類(MapResultHandler)中定義的相對應,這樣在ResultHandler 實現(xiàn)類(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 實現(xiàn)類(MapResultHandler),作為參數(shù)傳入。
取 Map 時依然從 ResultHandler 實現(xiàn)類(MapResultHandler)中取。
MapResultHandler handler = new MapResultHandler(); housePicInfoMapper.selectImageNameAndCreatetime(handler, length); Map imageMap = handler.getMapResults();
思考:對應 ResultHandler 接口只需實現(xiàn)一個 handleResult 方法,在 MyBatis 中 @MapKey 的實現(xiàn)也應該是有對應實現(xiàn)。
/**
* MyBatis 中 DefaultMapResultHandler 實現(xiàn)
* @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將查詢出的兩列數(shù)據(jù)裝配成鍵值對的文章就介紹到這了,更多相關MyBatis查詢數(shù)據(jù)裝配成鍵值對內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
DecimalFormat數(shù)字格式化 0和# 的區(qū)別及說明
這篇文章主要介紹了DecimalFormat數(shù)字格式化 0和# 的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10
SpringBoot文件上傳同時接收復雜參數(shù)的過程詳解
這篇文章主要介紹了SpringBoot文件上傳同時,接收復雜參數(shù),本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-12-12
Java編程實現(xiàn)五子棋人人對戰(zhàn)代碼示例
這篇文章主要介紹了Java編程實現(xiàn)五子棋人人對戰(zhàn)代碼示例,具有一定借鑒價值,需要的朋友可以參考下。2017-11-11
Java 中的CharArrayReader 介紹_動力節(jié)點Java學院整理
CharArrayReader 是字符數(shù)組輸入流。它和ByteArrayInputStream類似,只不過ByteArrayInputStream是字節(jié)數(shù)組輸入流,而CharArray是字符數(shù)組輸入流。CharArrayReader 是用于讀取字符數(shù)組,它繼承于Reader2017-05-05

