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ù)期不符。
要達(dá)到預(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)文章
JPA @Query時,無法使用limit函數(shù)的問題及解決
這篇文章主要介紹了JPA @Query時,無法使用limit函數(shù)的問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03
Spring中的@PropertySource注解源碼詳細(xì)解析
這篇文章主要介紹了Spring中的@PropertySource注解源碼詳細(xì)解析,@PropertySource注解,標(biāo)注在配置類@Configuration上面,下面主要分析一下@PropertySource注解的處理過程,也就是怎么把配置信息從.properies文件放到environment中的,需要的朋友可以參考下2024-01-01
Spring?boot?使用QQ郵箱進(jìn)行一個驗證登入功能
這篇文章主要介紹了Spring?boot?使用QQ郵箱進(jìn)行一個驗證登入,主要包括qq郵箱開啟權(quán)限和創(chuàng)建發(fā)送驗證碼的請求Controller,本文通過示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-10-10

