Mybatis中注解@MapKey的使用详解

 更新时间:2016年10月26日 09:02:36   投稿:mrr  
mybatis的原身是ibatis,现在已经脱离了apache基金会。这篇文章主要介绍了Mybatis中注解@MapKey的使用的相关资料,需要的朋友可以参考下

mybatis的原身是ibatis,现在已经脱离了apache基金会,新官网是http://www.mybatis.org/

在研究Mybatis源码之前并不知道这个注解的妙用的,但是当我看到参数解析的时候 有这个一个注解,所以我了解了一下,当我们返回像Map<String, Map<String, Object>>这种类型的时候,我们往往很难做到,因为这里面可能是多个表的数据,所以我们不可能再建一个模型。

这时候我们就可以使用这个注解了

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MapKey {
String value();
}

很明显,这个注解是作用在方法上面的,具体的用法就是设置外面Map的KEY是什么。这样我们就能够查询出非常复杂的结果,而不用在建立一个新的实体.

PS:下面看下MyBatis使用@MapKey注解接收多个查询记录到Map中,以便方便地用get()方法获取字段的值

需求场景:

批量从数据库查出若干条数据,包括id和name两个字段。希望可以把结果直接用Map接收,然后通过map.get(id)方便地获取name的值。

问题:

如果使用下面的代码,则如果查询结果是多条就会报错,因为MyBatis是把结果以("id":123)、("name":"Jack")的形式保存在Map中的。所以如果返回结果一条包括了id和name的记录就没问题;如果返回多条记录,即有多个("id":123)、("id":124),则MyBatis就傻掉不知如何处理了。

Map<String, Object> m = abcDao.getNamesByIds(idList); 

解决的方法是在外面再用一个Map:

Map<Integer, Map<String, Object>> m = abcDao.getNamesByIds(idList); 

然后,在这个dao的方法上面加一个注解:

<span style="white-space:pre"> </span>/** 
<span style="white-space:pre"> </span> * 根据多个id批量获取名称 
<span style="white-space:pre"> </span> * @param list 包含有Map key="id"的list 
<span style="white-space:pre"> </span> * @return 
<span style="white-space:pre"> </span> */ 
<span style="white-space:pre"> </span>@MapKey("id") 
<span style="white-space:pre"> </span>public Map<Integer, Map<String, Object>> getNamesByIds(List<Map<String, Object>> list); 

这个注解表示最外层Map的key为查询结果中字段名为“id”的值。

Mapper.xml中的配置如下:

<select id="getNamesByIds" resultType="java.util.Map"> 
 SELECT id, name FROM tb_abc WHERE id IN 
 <foreach item="item" collection="list" open="(" separator="," close=")"> 
   #{item.id} 
 </foreach> 
</select> 

以上所述是小编给大家介绍的Mybatis中注解@MapKey的使用详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • Java中的Kafka为什么性能这么快及4大核心详析

    Java中的Kafka为什么性能这么快及4大核心详析

    这篇文章主要介绍了Java中的Kafka为什么性能这么快及4大核心详析,文章通过围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-09-09
  • Alibaba Nacos配置中心动态感知原理示例解析

    Alibaba Nacos配置中心动态感知原理示例解析

    这篇文章主要介绍了Alibaba Nacos配置中心动态感知原理示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • IntelliJ IDEA 创建spring boot 的Hello World 项目(图解)

    IntelliJ IDEA 创建spring boot 的Hello World 项目(图解)

    这篇文章主要介绍了IntelliJ IDEA 创建spring boot 的Hello World 项目的步骤详解,需要的朋友可以参考下
    2018-01-01
  • 详解获取Spring MVC中所有RequestMapping以及对应方法和参数

    详解获取Spring MVC中所有RequestMapping以及对应方法和参数

    本篇文章主要介绍了详解获取Spring MVC中所有RequestMapping以及对应方法和参数,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-03-03
  • SpringBoot程序预装载数据的实现方法及实践

    SpringBoot程序预装载数据的实现方法及实践

    在项目实际的开发过程中,有时候会遇到需要在应用程序启动完毕对外提供服务之前预先将部分数据装载到缓存的需求。本文就总结了常见的数据预装载方式及其实践,感兴趣的朋友一起看看吧
    2022-04-04
  • 关于@RequestBody和@RequestParam注解的使用详解

    关于@RequestBody和@RequestParam注解的使用详解

    这篇文章主要介绍了关于@RequestBody和@RequestParam注解的使用详解,本文十分具有参考意义,希望可以帮助到你,如果有错误的地方还望不吝赐教
    2023-03-03
  • MyBatis-Plus联表查询以及分页代码实例

    MyBatis-Plus联表查询以及分页代码实例

    在开发中遇到了一个问题,需要进行联表查询并进行分页,因为不想自己来写分页,所以还是依靠MybatisPlus来实现想要的功能,下面这篇文章主要给大家介绍了关于MyBatis-Plus联表查询以及分页的相关资料,需要的朋友可以参考下
    2023-06-06
  • flowable表梳理步骤详解

    flowable表梳理步骤详解

    这篇文章主要介绍了flowable表梳理步骤详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-10-10
  • Java中不用第三个变量来互换两个变量的值

    Java中不用第三个变量来互换两个变量的值

    在程序运行期间,随时可能产生一些临时数据,应用程序会将这些数据保存在一些内存单元中,每个内存单元都用一个标识符来标识。这些内存单元被称为变量,定义的标识符就是变量名,内存单元中存储的数据就是变量的值
    2021-10-10
  • Java布隆过滤器的应用实例

    Java布隆过滤器的应用实例

    这篇文章主要介绍了Java布隆过滤器的应用实例,在程序的世界中,布隆过滤器是程序员的一把利器,利用它可以快速地解决项目中一些比较棘手的问题,如网页 URL 去重、垃圾邮件识别、大集合中重复元素的判断和缓存穿透等问题,需要的朋友可以参考下
    2023-11-11

最新评论