服务器之家

服务器之家 > 正文

Mybatis中注解@MapKey的使用详解

时间:2020-06-27 13:14     来源/作者:mrr

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

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

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

?
1
2
3
4
5
@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就傻掉不知如何处理了。

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

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

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

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

?
1
2
3
4
5
6
7
<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中的配置如下:

?
1
2
3
4
5
6
<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的使用详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!

标签:

相关文章

热门资讯

2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
歪歪漫画vip账号共享2020_yy漫画免费账号密码共享
歪歪漫画vip账号共享2020_yy漫画免费账号密码共享 2020-04-07
沙雕群名称大全2019精选 今年最火的微信群名沙雕有创意
沙雕群名称大全2019精选 今年最火的微信群名沙雕有创意 2019-07-07
玄元剑仙肉身有什么用 玄元剑仙肉身境界等级划分
玄元剑仙肉身有什么用 玄元剑仙肉身境界等级划分 2019-06-21
男生常说24816是什么意思?女生说13579是什么意思?
男生常说24816是什么意思?女生说13579是什么意思? 2019-09-17
返回顶部