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的使用詳解,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!