Mybatis中注解@MapKey的使用詳解
mybatis的原身是ibatis,現(xiàn)在已經(jīng)脫離了apache基金會(huì),新官網(wǎng)是http://www.mybatis.org/。
在研究Mybatis源碼之前并不知道這個(gè)注解的妙用的,但是當(dāng)我看到參數(shù)解析的時(shí)候 有這個(gè)一個(gè)注解,所以我了解了一下,當(dāng)我們返回像Map<String, Map<String, Object>>這種類型的時(shí)候,我們往往很難做到,因?yàn)檫@里面可能是多個(gè)表的數(shù)據(jù),所以我們不可能再建一個(gè)模型。
這時(shí)候我們就可以使用這個(gè)注解了
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface MapKey { String value(); }
很明顯,這個(gè)注解是作用在方法上面的,具體的用法就是設(shè)置外面Map的KEY是什么。這樣我們就能夠查詢出非常復(fù)雜的結(jié)果,而不用在建立一個(gè)新的實(shí)體.
PS:下面看下MyBatis使用@MapKey注解接收多個(gè)查詢記錄到Map中,以便方便地用get()方法獲取字段的值
需求場景:
批量從數(shù)據(jù)庫查出若干條數(shù)據(jù),包括id和name兩個(gè)字段。希望可以把結(jié)果直接用Map接收,然后通過map.get(id)方便地獲取name的值。
問題:
如果使用下面的代碼,則如果查詢結(jié)果是多條就會(huì)報(bào)錯(cuò),因?yàn)镸yBatis是把結(jié)果以("id":123)、("name":"Jack")的形式保存在Map中的。所以如果返回結(jié)果一條包括了id和name的記錄就沒問題;如果返回多條記錄,即有多個(gè)("id":123)、("id":124),則MyBatis就傻掉不知如何處理了。
Map<String, Object> m = abcDao.getNamesByIds(idList);
解決的方法是在外面再用一個(gè)Map:
Map<Integer, Map<String, Object>> m = abcDao.getNamesByIds(idList);
然后,在這個(gè)dao的方法上面加一個(gè)注解:
<span style="white-space:pre"> </span>/** <span style="white-space:pre"> </span> * 根據(jù)多個(gè)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);
這個(gè)注解表示最外層Map的key為查詢結(jié)果中字段名為“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的使用詳解,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
java基于數(shù)據(jù)庫實(shí)現(xiàn)全局唯一ID的示例
本文主要介紹了java基于數(shù)據(jù)庫實(shí)現(xiàn)全局唯一ID的示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-04-0425行Java代碼將普通圖片轉(zhuǎn)換為字符畫圖片和文本的實(shí)現(xiàn)
這篇文章主要介紹了25行Java代碼將普通圖片轉(zhuǎn)換為字符畫圖片和文本的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04SSM框架整合之Spring+SpringMVC+MyBatis實(shí)踐步驟
大家都知道Spring是一個(gè)輕量級的控制反轉(zhuǎn)(IoC)和面向切面(AOP)的容器框架,本文主要介紹三大框架的整合包含spring和mybatis的配置文件,還有spring-mvc的配置文件的詳細(xì)介紹,通過項(xiàng)目實(shí)踐步驟給大家詳細(xì)介紹,感興趣的朋友一起看看吧2021-06-06Spring中使用JSR303請求約束判空的實(shí)現(xiàn)
這篇文章主要介紹了Spring中使用JSR303請求約束判空的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12詳解Java構(gòu)建樹結(jié)構(gòu)的公共方法
本文主要介紹了詳解Java構(gòu)建樹結(jié)構(gòu)的公共方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04