mybatis的原身是ibatis,現(xiàn)在已經(jīng)脫離了apache基金會,新官網(wǎng)是http://www.mybatis.org/。
在研究Mybatis源碼之前并不知道這個注解的妙用的,但是當我看到參數(shù)解析的時候 有這個一個注解,所以我了解了一下,當我們返回像Map<String, Map<String, Object>>這種類型的時候,我們往往很難做到,因為這里面可能是多個表的數(shù)據(jù),所以我們不可能再建一個模型。
這時候我們就可以使用這個注解了
1
2
3
4
5
|
@Retention (RetentionPolicy.RUNTIME) @Target (ElementType.METHOD) public @interface MapKey { String value(); } |
很明顯,這個注解是作用在方法上面的,具體的用法就是設(shè)置外面Map的KEY是什么。這樣我們就能夠查詢出非常復雜的結(jié)果,而不用在建立一個新的實體.
PS:下面看下MyBatis使用@MapKey注解接收多個查詢記錄到Map中,以便方便地用get()方法獲取字段的值
需求場景:
批量從數(shù)據(jù)庫查出若干條數(shù)據(jù),包括id和name兩個字段。希望可以把結(jié)果直接用Map接收,然后通過map.get(id)方便地獲取name的值。
問題:
如果使用下面的代碼,則如果查詢結(jié)果是多條就會報錯,因為MyBatis是把結(jié)果以("id":123)、("name":"Jack")的形式保存在Map中的。所以如果返回結(jié)果一條包括了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> * 根據(jù)多個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為查詢結(jié)果中字段名為“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的使用詳解,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對服務(wù)器之家網(wǎng)站的支持!