快速學習-Mybatis 多表查詢之多對多
- 2020 年 4 月 1 日
- 筆記
第4章 Mybatis 多表查詢之多對多
4.1 實現 Role 到 User 多對多
通過前面的學習,我們使用 Mybatis 實現一對多關係的維護。多對多關係其實我們看成是雙向的一對多關係。
4.1.1 用戶與角色的關係模型


4.1.2 業務要求及實現 SQL
需求: 實現查詢所有對象並且載入它所分配的用戶資訊。 分析: 查詢角色我們需要用到Role表,但角色分配的用戶的資訊我們並不能直接找到用戶資訊,而是要通過中間表(USER_ROLE 表)才能關聯到用戶資訊。 下面是實現的 SQL 語句:
SELECT r.*,u.id uid, u.username username, u.birthday birthday, u.sex sex, u.address address FROM ROLE r INNER JOIN USER_ROLE ur ON ( r.id = ur.rid) INNER JOIN USER u ON (ur.uid = u.id);
4.1.3 編寫角色實體類
public class Role implements Serializable { private Integer roleId; private String roleName; private String roleDesc; //多對多的關係映射:一個角色可以賦予多個用戶 private List<User> users; public List<User> getUsers() { return users; } public void setUsers(List<User> users) { this.users = users; } public Integer getRoleId() { return roleId; } public void setRoleId(Integer roleId) { this.roleId = roleId; } public String getRoleName() { return roleName; } public void setRoleName(String roleName) { this.roleName = roleName; } public String getRoleDesc() { return roleDesc; } public void setRoleDesc(String roleDesc) { this.roleDesc = roleDesc; } @Override public String toString() { return "Role{" + "roleId=" + roleId + ", roleName='" + roleName + ''' + ", roleDesc='" + roleDesc + ''' + '}'; } }
4.1.4 編寫 Role 持久層介面
public interface IRoleDao { /** * 查詢所有角色 * @return */ List<Role> findAll(); }
4.1.5 編寫映射文件
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.itheima.dao.IRoleDao"> <!--定義role表的ResultMap--> <resultMap id="roleMap" type="role"> <id property="roleId" column="rid"></id> <result property="roleName" column="role_name"></result> <result property="roleDesc" column="role_desc"></result> <collection property="users" ofType="user"> <id column="id" property="id"></id> <result column="username" property="username"></result> <result column="address" property="address"></result> <result column="sex" property="sex"></result> <result column="birthday" property="birthday"></result> </collection> </resultMap> <!--查詢所有--> <select id="findAll" resultMap="roleMap"> 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 </select> </mapper>
4.1.6 編寫測試類
public class RoleTest { private InputStream in; private SqlSession sqlSession; private IRoleDao roleDao; @Before//用於在測試方法執行之前執行 public void init()throws Exception{ //1.讀取配置文件,生成位元組輸入流 in = Resources.getResourceAsStream("SqlMapConfig.xml"); //2.獲取SqlSessionFactory SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in); //3.獲取SqlSession對象 sqlSession = factory.openSession(true); //4.獲取dao的代理對象 roleDao = sqlSession.getMapper(IRoleDao.class); } @After//用於在測試方法執行之後執行 public void destroy()throws Exception{ //提交事務 // sqlSession.commit(); //6.釋放資源 sqlSession.close(); in.close(); } /** * 測試查詢所有 */ @Test public void testFindAll(){ List<Role> roles = roleDao.findAll(); for(Role role : roles){ System.out.println("---每個角色的資訊----"); System.out.println(role); System.out.println(role.getUsers()); } } }
4.2 實現 User 到 Role 的多對多
4.2.1 User 到 Role 的多對多
從 User 出發,我們也可以發現一個用戶可以具有多個角色,這樣用戶到角色的關係也還是一對多關係。這樣我們就可以認為 User 與 Role 的多對多關係,可以被拆解成兩個一對多關係來實現。