欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Mybatis中注解@MapKey的使用详解

程序员文章站 2024-03-12 18:57:26
mybatis的原身是ibatis,现在已经脱离了apache基金会,新官网是。 在研究mybatis源码之前并不知道这个注解的妙用的,但是当我看到参数解析的时候 有这个...

mybatis的原身是ibatis,现在已经脱离了apache基金会,新官网是。

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