首页 > 编程语言 >Java MyBatis返回两个字段作为Map的key和value

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

时间:2024-12-06 15:21:50浏览次数:6  
标签:Map MapResultHandler Java value t1 key type

使用 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;
    }
}
  1. 编写 Mapper.java
void selectMap(MapResultHandler<String, String> mapResultHandler);
如果要传参,在前面指定即可,比如:
void selectMap(@Param("type") String type, MapResultHandler<String, String> mapResultHandler);
  1. 编写 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>
  1. 调用
MapResultHandler<String, String> resultHandler = new MapResultHandler<>();
baseMapper.selectMapByLanguage(Global.getLanguage(), resultHandler);
Map<String, String> map = resultHandler.getMappedResults();

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

标签:Map,MapResultHandler,Java,value,t1,key,type
From: https://www.cnblogs.com/skysailstar/p/18590883

相关文章

  • JAVA8的computeIfAbsent使用方法
    基础说明computeIfAbsent是Java8引入的Map接口中的一个默认方法。它允许你以原子操作的方式在给定键不存在时计算其值,并将其添加到映射中。如果该键已经存在,则返回已存在的值而不执行任何计算。下面是computeIfAbsent的基本用法:Map<K,V>map=newConcurrentHashMap<......
  • 无插件H5播放器EasyPlayer.js网页直播/点播播放器应该怎么使用JavaScript初始化?
    JavaScript可以用来控制播放器的基本功能,如播放、暂停、停止、快进、快退等。通过监听播放器的事件,JavaScript可以响应用户的操作,实现交互式控制。使用JavaScript,开发者可以创建自定义的播放器界面,而不是使用浏览器默认的控件。这可以通过操作DOM来实现,比如显示播放进度条、音量控......
  • 斗地主之顺子(Java & Python& JS & C++ & C )
    题目描述在斗地主扑克牌游戏中,扑克牌由小到大的顺序为:3,4,5,6,7,8,9,10,J,Q,K,A,2,玩家可以出的扑克牌阵型有:单张、对子、顺子、飞机、炸弹等。其中顺子的出牌规则为:由至少5张由小到大连续递增的扑克牌组成,且不能包含2。例如:{3,4,5,6,7}、{3,4,5,6,7,8,9,10,J,Q,K,A}都是......
  • Java和.Net互相使用RSA加密时的问题和处理方法
    前言我们产品是使用JAVA语言开发的,有个供第三方获取Token的接口,过程大概就是第三方先调一个注册接口,获取一个RSA公钥,然后用通过公钥加密后的一些认证信息调用获取Token的接口,如果信息无误,则发放Token。前段时间就遇到了对方是使用.Net进行开发的系统,在第一步获取公钥时没用问题,......
  • 二分查找及java代码实现
    二分查找(BinarySearch)是一种在有序数组中查找特定元素的搜索算法。它通过比较数组中间元素与目标值来确定目标值所在的范围,然后在这个范围内继续进行二分查找,直到找到目标值或确定目标值不存在。二分查找的基本步骤:1. 初始化:设置两个指针,一个指向数组的开始(low),另一个指向......
  • 医院招聘考试管理系统|Java|SSM|JSP| 前后端分离
    【重要1⃣️】前后端源码+万字文档+部署文档            【包含内容】【一】项目提供非常完整的源码注释【二】相关技术栈文档【三】源码讲解视频                     【其它服务】【一】可以提供远程......
  • 医院远程诊断管理系统|Java|SSM|JSP| 前后端分离
    【重要1⃣️】前后端源码+万字文档+部署文档【一】项目提供非常完整的源码注释【二】相关技术栈文档【三】源码讲解视频                     【其它服务】【一】可以提供远程部署安装,包扩环境【二】提供软件相关的安装包【三】......
  • 考研信息查询系统|Java|SSM|VUE| 前后端分离
    【重要1⃣️】前后端源码+万字文档+部署文档            【包含内容】【一】项目提供非常完整的源码注释【二】相关技术栈文档【三】源码讲解视频                     【其它服务】【一】可以提供远程......
  • 医院挂号管理系统|Java|SSM|JSP| 前后端分离
    【重要1⃣️】前后端源码+万字文档+部署文档            【包含内容】【一】项目提供非常完整的源码注释【二】相关技术栈文档【三】源码讲解视频                     【其它服务】【一】可以提供远程......
  • 医院远程诊断管理系统|Java|SSM|JSP| 前后端分离
    【重要1⃣️】前后端源码+万字文档+部署文档            【包含内容】【一】项目提供非常完整的源码注释【二】相关技术栈文档【三】源码讲解视频                     【其它服务】【一】可以提供远程......