Java MyBatis返回兩個字段作為Map的key和value問題
Java MyBatis返回兩個字段作為Map的key和value
使用 MyBatis 時,可能會遇到這種情況:
只查詢兩個字段,需要返回一個 Map,其中第一個字段作為 key,第二個字段作為 value。
這種查詢在某些場景非常好用,比如查詢字典,查詢出的 key 和 value 就是字典的 value 和 label,利用 HashMap 的 get 方法時間復(fù)雜度為 O(1) 的特點,可以實現(xiàn)字典的快速映射。
此時的寫法是有講究的
直接返回 Map:
當(dāng)數(shù)據(jù)量超過 1 時,會報錯。因為此時將 Map 作為一個對象,一個對象不能存儲多個內(nèi)容。
加上 <font style="color:rgb(77, 77, 77);">@MapKey</font>
注解:
需要指定返回的哪個字段作為 key。雖然能生成 Map,但其中的 value 是一個對象,不是直接值,與預(yù)期不符。
要達到預(yù)期的返回值,需要使用 MyBatis 提供的 ResultHandler
結(jié)果處理器。
1.自定義一個 Map結(jié)果處理器
<font style="color:#080808;background-color:#ffffff;">MapResultHandler</font>
public class MapResultHandler<K,V> implements ResultHandler<Map<K,V>> { private final Map<K,V> mappedResults = new HashMap<>(); @Override public void handleResult(ResultContext context) { Map map = (Map) context.getResultObject(); mappedResults.put((K)map.get("key"), (V)map.get("value")); } public Map<K,V> getMappedResults() { return mappedResults; } }
2.編寫 Mapper.java
void selectMap(MapResultHandler<String, String> mapResultHandler);
如果要傳參,在前面指定即可,比如:
void selectMap(@Param("type") String type, MapResultHandler<String, String> mapResultHandler);
3.編寫 Mapper.xml
<resultMap id="mapResult" type="java.util.HashMap"> <result property="key" column="value"/> <result property="value" column="label"/> </resultMap> <select id="selectMap" resultMap="mapResult"> SELECT t1.`value`, t1.`label` FROM sys_dict t1 WHERE t1.`type` = #{type} AND t1.`del_flag` = '0' </select>
4.調(diào)用
MapResultHandler<String, String> resultHandler = new MapResultHandler<>(); baseMapper.selectMapByLanguage(Global.getLanguage(), resultHandler); Map<String, String> map = resultHandler.getMappedResults();
這樣得到的 Map 就是將兩個字段作為 Map 的 key 和 value 了。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java8日期類LocalDate、LocalTime和LocalDateTime使用方法詳解
這篇文章主要給大家介紹了關(guān)于Java8日期類LocalDate、LocalTime和LocalDateTime使用方法的相關(guān)資料,LocalDateTime是JDK1.8出現(xiàn)的新特性,解決線程不安全的問題,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2023-11-11Java實現(xiàn)RedisUtils操作五大集合(增刪改查)
本文主要介紹了Java實現(xiàn)RedisUtils操作五大集合,文中通過示例代碼介紹的非常詳細,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-07-07java連接mysql數(shù)據(jù)庫亂碼的解決方法
這篇文章主要介紹通過java連接mysql數(shù)據(jù)庫的時候,頁面出現(xiàn)亂碼,這里簡單分享下解決方法, 需要的朋友可以參考下2013-05-05Springboot獲取前端反饋信息并存入數(shù)據(jù)庫的實現(xiàn)代碼
這篇文章主要介紹了Springboot獲取前端反饋信息并存入數(shù)據(jù)庫的實現(xiàn)代碼,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-03-03利用SpringMVC接收復(fù)雜對象和多個文件(前端使用JQuery)
這篇文章主要介紹了利用SpringMVC接收復(fù)雜對象和多個文件(前端使用JQuery),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-10-10SpringBoot整合Groovy腳本實現(xiàn)動態(tài)編程詳解
這篇文章主要為大家介紹了SpringBoot整合Groovy腳本實現(xiàn)動態(tài)編程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-09-09Idea代理設(shè)置與Java程序的代理設(shè)置方式
文章總結(jié):學(xué)習(xí)WebService時,使用Fiddler抓取包數(shù)據(jù),發(fā)現(xiàn)Idea代理設(shè)置與Java程序代理設(shè)置不同,Java程序需要在發(fā)送請求前設(shè)置代理,代碼如下2025-01-01一個MIDP俄羅斯方塊游戲的設(shè)計和實現(xiàn)
一個MIDP俄羅斯方塊游戲的設(shè)計和實現(xiàn)...2006-12-12