欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java MyBatis返回兩個(gè)字段作為Map的key和value問(wèn)題

 更新時(shí)間:2024年12月14日 10:08:32   作者:天航星  
使用MyBatis查詢(xún)兩個(gè)字段并返回Map時(shí),需要注意數(shù)據(jù)量和值的類(lèi)型,直接返回Map會(huì)導(dǎo)致報(bào)錯(cuò),使用@MapKey注解可以生成Map,但值是對(duì)象而不是直接值,為了解決這個(gè)問(wèn)題,可以自定義一個(gè)Map結(jié)果處理器MapResultHandler

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)文章

最新評(píng)論