Java MyBatis返回兩個(gè)字段作為Map的key和value問(wèn)題
Java MyBatis返回兩個(gè)字段作為Map的key和value
使用 MyBatis 時(shí),可能會(huì)遇到這種情況:
只查詢(xún)兩個(gè)字段,需要返回一個(gè) Map,其中第一個(gè)字段作為 key,第二個(gè)字段作為 value。
這種查詢(xún)?cè)谀承﹫?chǎng)景非常好用,比如查詢(xún)字典,查詢(xún)出的 key 和 value 就是字典的 value 和 label,利用 HashMap 的 get 方法時(shí)間復(fù)雜度為 O(1) 的特點(diǎn),可以實(shí)現(xiàn)字典的快速映射。
此時(shí)的寫(xiě)法是有講究的
直接返回 Map:
當(dāng)數(shù)據(jù)量超過(guò) 1 時(shí),會(huì)報(bào)錯(cuò)。因?yàn)榇藭r(shí)將 Map 作為一個(gè)對(duì)象,一個(gè)對(duì)象不能存儲(chǔ)多個(gè)內(nèi)容。
加上 <font style="color:rgb(77, 77, 77);">@MapKey</font>
注解:
需要指定返回的哪個(gè)字段作為 key。雖然能生成 Map,但其中的 value 是一個(gè)對(duì)象,不是直接值,與預(yù)期不符。
要達(dá)到預(yù)期的返回值,需要使用 MyBatis 提供的 ResultHandler
結(jié)果處理器。
1.自定義一個(gè) 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.編寫(xiě) Mapper.java
void selectMap(MapResultHandler<String, String> mapResultHandler);
如果要傳參,在前面指定即可,比如:
void selectMap(@Param("type") String type, MapResultHandler<String, String> mapResultHandler);
3.編寫(xiě) 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 就是將兩個(gè)字段作為 Map 的 key 和 value 了。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java8日期類(lèi)LocalDate、LocalTime和LocalDateTime使用方法詳解
這篇文章主要給大家介紹了關(guān)于Java8日期類(lèi)LocalDate、LocalTime和LocalDateTime使用方法的相關(guān)資料,LocalDateTime是JDK1.8出現(xiàn)的新特性,解決線程不安全的問(wèn)題,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-11-11Java實(shí)現(xiàn)RedisUtils操作五大集合(增刪改查)
本文主要介紹了Java實(shí)現(xiàn)RedisUtils操作五大集合,文中通過(guò)示例代碼介紹的非常詳細(xì),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-07-07java連接mysql數(shù)據(jù)庫(kù)亂碼的解決方法
這篇文章主要介紹通過(guò)java連接mysql數(shù)據(jù)庫(kù)的時(shí)候,頁(yè)面出現(xiàn)亂碼,這里簡(jiǎn)單分享下解決方法, 需要的朋友可以參考下2013-05-05Springboot獲取前端反饋信息并存入數(shù)據(jù)庫(kù)的實(shí)現(xiàn)代碼
這篇文章主要介紹了Springboot獲取前端反饋信息并存入數(shù)據(jù)庫(kù)的實(shí)現(xiàn)代碼,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03利用SpringMVC接收復(fù)雜對(duì)象和多個(gè)文件(前端使用JQuery)
這篇文章主要介紹了利用SpringMVC接收復(fù)雜對(duì)象和多個(gè)文件(前端使用JQuery),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10SpringBoot整合Groovy腳本實(shí)現(xiàn)動(dòng)態(tài)編程詳解
這篇文章主要為大家介紹了SpringBoot整合Groovy腳本實(shí)現(xiàn)動(dòng)態(tài)編程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09Idea代理設(shè)置與Java程序的代理設(shè)置方式
文章總結(jié):學(xué)習(xí)WebService時(shí),使用Fiddler抓取包數(shù)據(jù),發(fā)現(xiàn)Idea代理設(shè)置與Java程序代理設(shè)置不同,Java程序需要在發(fā)送請(qǐng)求前設(shè)置代理,代碼如下2025-01-01一個(gè)MIDP俄羅斯方塊游戲的設(shè)計(jì)和實(shí)現(xiàn)
一個(gè)MIDP俄羅斯方塊游戲的設(shè)計(jì)和實(shí)現(xiàn)...2006-12-12