快速學習-Mybatis 多表查詢之多對多

第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 的多對多關係,可以被拆解成兩個一對多關係來實現。