十年網(wǎng)站開(kāi)發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專業(yè)推廣+無(wú)憂售后,網(wǎng)站問(wèn)題一站解決
這篇文章主要介紹了Mybatis中resultMap功能怎么用,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)公司!專注于網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、微信平臺(tái)小程序開(kāi)發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了新羅免費(fèi)建站歡迎大家使用!
前言
在Mybatis中,有一個(gè)強(qiáng)大的功能元素resultMap。當(dāng)我們希望將JDBC ResultSets中的數(shù)據(jù),轉(zhuǎn)化為合理的Java對(duì)象時(shí),你就能感受到它的非凡之處。正如其官方所述的那樣:
resultMap元素是 MyBatis 中最重要最強(qiáng)大的元素。它可以讓你從 90% 的 JDBC ResultSets 數(shù)據(jù)提取代碼中解放出來(lái),并在一些情形下允許你進(jìn)行一些 JDBC 不支持的操作。實(shí)際上,在為一些比如連接的復(fù)雜語(yǔ)句編寫(xiě)映射代碼的時(shí)候,一份 resultMap 能夠代替實(shí)現(xiàn)同等功能的長(zhǎng)達(dá)數(shù)千行的代碼。ResultMap 的設(shè)計(jì)思想是,對(duì)于簡(jiǎn)單的語(yǔ)句根本不需要配置顯式的結(jié)果映射,而對(duì)于復(fù)雜一點(diǎn)的語(yǔ)句只需要描述它們的關(guān)系就行了。
一、字段映射
在Mybatis中,最簡(jiǎn)單的結(jié)果映射方式,就是通過(guò)類型別名typeAliases來(lái)處理。
如果要這樣做,那么第一步需要配置實(shí)體類包的路徑:
mybatis.type-aliases-package=com.xxx.entity
該路徑下的所有類,就會(huì)被注冊(cè)到TYPE_ALIASES容器。我們?cè)谥付ǚ祷刂殿愋偷臅r(shí)候,就直接用別名即可。
比如,我們有一個(gè)User類:
@Datapublic class User { private String id; private String username; private String password; private String address; private String email;}
如果數(shù)據(jù)庫(kù)中表的字段與User類的屬性名稱一致,我們就可以使用resultType來(lái)返回。
當(dāng)然,這是理想狀態(tài)下,屬性和字段名都完全一致的情況。但事實(shí)上,不一致的情況是有的,這時(shí)候我們的resultMap就要登場(chǎng)了。
如果User類保持不變,但SQL語(yǔ)句發(fā)生了變化,將id改成了uid。
那么,在結(jié)果集中,我們將會(huì)丟失id數(shù)據(jù)。這時(shí)候我們就可以定義一個(gè)resultMap,來(lái)映射不一樣的字段。
然后,我們把上面的select語(yǔ)句中的resultType修改為resultMap="getUserByIdMap"
。
這里面column對(duì)應(yīng)的是數(shù)據(jù)庫(kù)的列名或別名;property對(duì)應(yīng)的是結(jié)果集的字段或?qū)傩浴?/p>
這就是resultMap最簡(jiǎn)單,也最基礎(chǔ)的用法:字段映射。
下面,我們看看其他幾種標(biāo)簽都是怎么應(yīng)用的。
元素名稱 | 描述 |
---|---|
constructor | 用于在實(shí)例化類時(shí),注入結(jié)果到構(gòu)造方法中 |
association | 關(guān)聯(lián)一個(gè)對(duì)象 |
collection | 關(guān)聯(lián)多個(gè)對(duì)象 |
二、構(gòu)造方法
如果你希望將結(jié)果注入構(gòu)造方法里,就可以用到constructor元素。
比如,我們的User類增加了一個(gè)構(gòu)造方法:
public User(String id, String name) {this.id = id+"--------";this.username = name+"--------";}
我們需要在resultMap中定義constructor元素:
其中,column代表數(shù)據(jù)庫(kù)字段名稱或者別名;name則是構(gòu)造方法中的參數(shù)名稱;javaType指定了參數(shù)的類型。
如你所想,這樣指定構(gòu)造方法后,我們結(jié)果集中的id和username屬性都會(huì)發(fā)生變化。
{ "id": "1001--------", "username": "后羿--------", "password": "123456", "address": "北京市海淀區(qū)", "email": "510273027@qq.com"}
三、關(guān)聯(lián)
在實(shí)際的業(yè)務(wù)中,我們的用戶一般都會(huì)有一個(gè)角色。那么在User類里面一般也是以一個(gè)實(shí)體類來(lái)表示。
@Datapublic class User { //省略用戶屬性... //角色信息 private Role role;}
我們?cè)诓樵冇脩舻臅r(shí)候,如果也希望看到它的角色信息,我們會(huì)這樣來(lái)寫(xiě)查詢語(yǔ)句:
如上,就要查詢單個(gè)用戶以及用戶的角色信息。不過(guò)在這里,我們不能用resultType=User
來(lái)返回。
畢竟,User類中只有一個(gè)Role對(duì)象,并沒(méi)有role_id和role_name字段屬性。
所以,我們要使用association來(lái)關(guān)聯(lián)它們。
最后我們就可以將角色信息一塊顯示出來(lái):
{ "id": "1001", "username": "后羿", "password": "123456", "address": "北京市海淀區(qū)", "email": "510273027@qq.com", "role": { "id": "3", "name": "射手" }}
事實(shí)上,如果你確定關(guān)聯(lián)信息是一對(duì)一的情況,有個(gè)更簡(jiǎn)便的方法可以替代association,我們?cè)诒疚牡牡谖宀糠?自動(dòng)填充關(guān)聯(lián)對(duì)象再看它是怎么實(shí)現(xiàn)的。
四、集合
1、集合的嵌套結(jié)果映射
上面我們看到一個(gè)用戶后羿,它的角色是射手;但大部分時(shí)候,我們每個(gè)人都不可能只擁有一種角色。所以,我們需要將User類中的角色屬性的類型改成List。
@Datapublic class User { //省略用戶屬性... //角色信息 private List
現(xiàn)在就變成了一個(gè)用戶對(duì)應(yīng)多個(gè)角色,所以就不是簡(jiǎn)單的association。
因?yàn)閍ssociation處理的是有一個(gè)類型的關(guān)聯(lián);而我們這里是有多個(gè)類型的關(guān)聯(lián),所以就需要用到collection屬性。
我們整體的resultMap會(huì)變成下面這樣:
這樣的話,即便你有多個(gè)角色也可以被正確顯示:
{ "id": "1003", "username": "貂蟬", "password": "123456", "address": "北京市東城區(qū)", "email": "510273027@qq.com", "roles": [ { "id": "1", "name": "中單" }, { "id": "2", "name": "打野" } ]}
2、集合的嵌套 Select 查詢
在大部分業(yè)務(wù)系統(tǒng)中,我們都會(huì)有一個(gè)菜單的表,比如像下面這樣,一張Menu表:
id | name | url | parent_id |
---|---|---|---|
1 | 系統(tǒng)管理 | 0 | |
1001 | 用戶管理 | /user | 1 |
1002 | 角色管理 | /role | 1 |
1003 | 單位管理 | /employer | 1 |
2 | 平臺(tái)監(jiān)控 | 0 | |
2001 | 系統(tǒng)監(jiān)控 | /system/monitor | 2 |
2002 | 數(shù)據(jù)監(jiān)控 | /data/monitor | 2 |
這里我們給菜單分為兩級(jí)。我們給前端返回菜單的時(shí)候,也是需要分級(jí)的,不可能將這7條數(shù)據(jù)平級(jí)展示。那么,在這里我們的Menu實(shí)體類如下:
@Datapublic class Menu { private String id; private String name; private String url; private String parent_id; private List