Java MyBatis返回两个字段作为Map的key和value问题

 更新时间:2024年12月14日 10:08:32   作者:天航星  
使用MyBatis查询两个字段并返回Map时,需要注意数据量和值的类型,直接返回Map会导致报错,使用@MapKey注解可以生成Map,但值是对象而不是直接值,为了解决这个问题,可以自定义一个Map结果处理器MapResultHandler

Java MyBatis返回两个字段作为Map的key和value

使用 MyBatis 时,可能会遇到这种情况:

只查询两个字段,需要返回一个 Map,其中第一个字段作为 key,第二个字段作为 value。

这种查询在某些场景非常好用,比如查询字典,查询出的 key 和 value 就是字典的 value 和 label,利用 HashMap 的 get 方法时间复杂度为 O(1) 的特点,可以实现字典的快速映射。

此时的写法是有讲究的

直接返回 Map:

当数据量超过 1 时,会报错。因为此时将 Map 作为一个对象,一个对象不能存储多个内容。

加上 <font style="color:rgb(77, 77, 77);">@MapKey</font>注解:

需要指定返回的哪个字段作为 key。虽然能生成 Map,但其中的 value 是一个对象,不是直接值,与预期不符。

要达到预期的返回值,需要使用 MyBatis 提供的 ResultHandler 结果处理器。

1.自定义一个 Map结果处理器

<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.调用

MapResultHandler<String, String> resultHandler = new MapResultHandler<>();
baseMapper.selectMapByLanguage(Global.getLanguage(), resultHandler);
Map<String, String> map = resultHandler.getMappedResults();

这样得到的 Map 就是将两个字段作为 Map 的 key 和 value 了。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 详解Spring整合mybatis--Spring中的事务管理(xml形式)

    详解Spring整合mybatis--Spring中的事务管理(xml形式)

    这篇文章主要介绍了Spring整合mybatis--Spring中的事务管理(xml形式),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-11-11
  • Java 数据库连接池Druid 的介绍

    Java 数据库连接池Druid 的介绍

    这篇文章主要给大家分享的是 Java 数据库连接池Druid 的介绍,Druid是一个JDBC组件,它包括三部分: DruidDriver 代理Driver,能够提供基于Filter-Chain模式的插件体系。 DruidDataSource 高效可管理的数据库连接池,下面来看看文中的详细内容,需要的朋友也可以参考一下
    2021-11-11
  • JAVA实现的CrazyArcade泡泡堂游戏

    JAVA实现的CrazyArcade泡泡堂游戏

    CrazyArcade泡泡堂游戏,一款用Java编写的JavaSwing游戏程序。 使用了MVC模式,分离了模型、视图和控制器,使得项目结构清晰易于扩展,使用配置文件来设置游戏基本配置,扩展地图人物道具等。同时,该程序编写期间用了单例模式、工厂模式、模板模式等设计模式。
    2021-04-04
  • Java多线程模拟银行系统存钱问题详解

    Java多线程模拟银行系统存钱问题详解

    本文将利用Java多线程模拟一个简单的银行系统,使用两个不同的线程向同一个账户存钱。文中的示例代码讲解详细,感兴趣的可以了解一下
    2022-09-09
  • Mybatis集成到Spring容器的详细步骤

    Mybatis集成到Spring容器的详细步骤

    在现在的JavaEE开发过程中,我们经常会使用到Spring+SpringMVC+Mybatis这个组合,那么Mybatis是如何集成到Spring中的呢,下面通过实例代码给大家详细讲解,感兴趣的朋友跟随小编一起看看吧
    2024-03-03
  • SpringBoot搭建Dubbo项目实现斐波那契第n项详解

    SpringBoot搭建Dubbo项目实现斐波那契第n项详解

    这篇文章主要讲解了“SpringBoot+Dubbo怎么实现斐波那契第N项”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习吧
    2022-06-06
  • 详谈Java中的事件监听机制

    详谈Java中的事件监听机制

    下面小编就为大家带来一篇详谈Java中的事件监听机制。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • springboot如何读取配置文件(application.yml)中的属性值

    springboot如何读取配置文件(application.yml)中的属性值

    本篇文章主要介绍了springboot如何读取配置文件(application.yml)中的属性值,具有一定的参考价值,有兴趣的小伙伴可以了解一下
    2017-04-04
  • java判定数组或集合是否存在某个元素的实例

    java判定数组或集合是否存在某个元素的实例

    下面小编就为大家带来一篇java判定数组或集合是否存在某个元素的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • JavaCV实现多个MP4视频的合并

    JavaCV实现多个MP4视频的合并

    这篇文章主要为大家详细介绍了如何使用javacv和ffmpeg框架实现简单快速的合并mp4文件的视频和音频,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-10-10

最新评论