­

快速学习-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 的多对多关系,可以被拆解成两个一对多关系来实现。