Mybatis中注解@MapKey的使用详解

作者:mrr 时间:2023-11-24 21:43:35 

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的使用详解,希望对大家有所帮助。

标签:mybatis,mapkey,注解
0
投稿

猜你喜欢

  • Android中实现TCP和UDP传输实例

    2021-11-08 14:19:59
  • 解析C#设计模式之单例模式

    2021-12-15 17:41:12
  • Java中JSR303的基本使用详情

    2021-07-29 01:01:12
  • java开发实现五子棋游戏

    2021-09-07 12:41:32
  • C#飞机打字游戏的代码示例(winform版)

    2021-09-10 17:43:17
  • Java基础之Thymeleaf的简单使用

    2023-08-24 19:00:22
  • 基于XSLT调试的相关问题

    2022-11-01 14:22:53
  • android自定义view之模拟qq消息拖拽删除效果

    2023-01-29 11:48:34
  • java实现快速打字游戏

    2022-11-05 11:16:38
  • ShardingSphere解析SQL示例详解

    2023-11-23 13:57:55
  • 全网最全SpringBoot集成swagger的详细教程

    2021-10-25 16:53:44
  • java异常处理执行顺序详解try catch finally

    2022-10-01 04:10:10
  • Kryo框架使用方法代码示例

    2021-05-30 15:46:05
  • Java单例模式简单示例

    2022-04-24 03:46:20
  • Java如何根据不同系统动态获取换行符和盘分割符

    2022-02-27 10:33:10
  • 记一次公司JVM堆溢出抽丝剥茧定位的过程解析

    2023-11-09 13:11:24
  • java实现MD5加密算法的实例代码

    2021-10-01 16:49:14
  • java基础的详细了解第八天

    2023-11-08 10:47:47
  • C#设置软件开机自动运行的方法(修改注册表)

    2022-08-27 21:05:46
  • Java Jedis NOAUTH Authentication required问题解决方法

    2023-08-19 14:09:47
  • asp之家 软件编程 m.aspxhome.com