1. 程式人生 > 實用技巧 >MyBatis 多對多查詢的實現

MyBatis 多對多查詢的實現

  這次我們來實現多對多查詢,我們考慮使用者和角色這兩個關係,角色有很多種比如說院長,校長什麼的。一個使用者可能有多個角色,一個角色可以賦予多個使用者。這樣使用者和角色兩個實體類就是多對多的。

  現在我們要實現查詢使用者時,可以同時得到使用者所包含的角色資訊。當我們查詢角色時,可以同時得到角色的所賦予的使用者資訊。

前期工作

  我們創一個新的工程,然後把one2many的配置全部cv進來,然後刪掉account有關的東西

  多對多關係就必然要有個中間表,我們用以下程式碼建表

DROP TABLE IF EXISTS `role`;

CREATE TABLE `role` (
  `ID` 
int(11) NOT NULL COMMENT '編號', `ROLE_NAME` varchar(30) default NULL COMMENT '角色名稱', `ROLE_DESC` varchar(60) default NULL COMMENT '角色描述', PRIMARY KEY (`ID`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; insert into `role`(`ID`,`ROLE_NAME`,`ROLE_DESC`) values (1,'院長','管理整個學院'),(2,'總裁','管理整個公司'),(3,'校長
','管理整個學校'); CREATE TABLE `user_role` ( `UID` int(11) NOT NULL COMMENT '使用者編號', `RID` int(11) NOT NULL COMMENT '角色編號', PRIMARY KEY (`UID`,`RID`), KEY `FK_Reference_10` (`RID`), CONSTRAINT `FK_Reference_10` FOREIGN KEY (`RID`) REFERENCES `role` (`ID`), CONSTRAINT `FK_Reference_9` FOREIGN
KEY (`UID`) REFERENCES `user` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; insert into `user_role`(`UID`,`RID`) values (41,1),(45,1),(41,2);
建表程式碼

  其中role是角色表,user_role就是中間表,中間表包含uid和rid分別對應user表和role表的主鍵,中間表可以理解為就是一個map對映

  然後我們來到java建立role的實體類,生成相應方法,注意這裡的變數名和資料庫表的列名不一致

  然後我們來寫role的dao介面

  接著我們來寫role的xml配置

  隨後我們就來寫測試類,直接用user的cv一個roletest

  執行一下,奈斯

查角色獲得角色和使用者

  因為角色和使用者是多對多,我們的role類裡就要加入多對多的關係對映,也就是有個user的list,並生成對應方法

  在考慮xml配置之前我們得先想我們的sql語句要怎麼寫,我們要求在查詢角色的條件下,同時得到該角色賦予的所有使用者,我們得到的結果集應該長這樣,依據是那張中間表

  所以我們是不是有點眉目了,首先我們講role左外連線中間表(id=rid),然後再左外連線user表(uid=id),一共兩次左外連線

select u.*,r.id as rid,r.role_name,r.role_desc from role r 
left outer join user_role ur on r.id = ur.rid
left outer join user u on u.id = ur.uid;
sql語句

  然後我們在xml配置裡面加入這條sql語句,這裡有個注意的點就是換行處最好加個空格,這樣在字串拼接的時候語句就不會沒間隔

  最後我們配置resultMap,和上次一樣是collection配置,這裡需要注意因為我們role表的id起了別名叫rid,我們在resultMap裡要對應改成rid

  最後我們在測試類加個分割線和輸出使用者表

  跑一下,見證奇蹟的時刻到了!啊!奈斯~

查使用者獲得使用者和角色

  那這個流程和查角色是差不多的,角色到使用者反過來就是使用者到角色,我們只需改改sql語句,使用者左外連線中間表然後再左外連線角色表就行(把上面的左外改成右外也行)

  我們來到user類,為它新增多對多的關係對映

  接著我們寫user的xml配置,和上次的寫法差不多,需要注意role表的id欄位改名為rid了

  最後我們改改測試類

  run一下,搞定,41和45的user下面有角色資訊