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