Mybatis中的多表查询 多对多

示例:用户和角色
  一个用户可以有多个角色
  一个角色可以赋予多个用户
步骤:
  1、建立两张表:用户表,角色表
    让用户表和角色表具有多对多的关系。

    需要使用中间表,中间表中包含各自的主键,在中间表中是外键。
  2、建立两个实体类:用户实体类和角色实体类
    让用户和角色的实体类能体现出来多对多的关系
    各自包含对方一个集合引用
  3、建立两个配置文件
    用户的配置文件
    角色的配置文件
  4、实现配置:
    当我们查询用户时,可以同时得到用户所包含的角色信息
    当我们查询角色时,可以同时得到角色的所赋予的用户信息

role表:

user表:

user_role表:

实现 Role 到 User 多对多 

需求:

  实现查询所有角色并且加载它所分配的用户信息

分析: 

  查询角色我们需要用到Role表,但角色分配的用户的信息我们并不能直接找到用户信息

  而是要通过中 间表(USER_ROLE 表)才能关联到用户信息。 

实现的 SQL 语句:

  SELECT role.id as rid , role.role_name , role.role_desc  ,   user.*         

  FROM  role

  INNER JOIN  user_role      

  ON ( role.id = user_role.rid)       

  INNER JOIN  user         

  ON (user_role.uid = user.id);

   

创建角色实体类Role

public class Role implements Serializable {
    private Integer roleId;
    private String roleName;
    private String roleDesc;
  //多对多的关系映射:一个角色可以赋予多个用户     
private List<User> users;
/*get set toString*/ }

 编写 Role 持久层接口 

public interface IRoleDao  {
    List<Role> findAll();
}

 编写持久层接口IRoleDao对应的映射配置文件IRoleDao.xml

<?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.mkl.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 role.id as rid , role.role_name , role.role_desc, user.*
        FROM  ROLE
        INNER JOIN  USER_ROLE
        ON ( ROLE.id = USER_ROLE.rid)
        INNER JOIN  USER
        ON (USER_ROLE.uid = USER .id);
    </select>
</mapper>

User到Role 多对多 

实体类User中 :

    private List<Role> roles;

    /*get set */

IUserDao.xml :

    <resultMap id="userMap" type="user">
        <id column="id" property="id"></id>
        <result column="username" property="username"/>
        <result column="address" property="address"/>
        <result column="sex" property="sex"/>
        <result column="birthday" property="birthday"/>
        <collection property="roles" ofType="role">
            <id property="roleId" column="rid"></id>
            <result property="roleName" column="role_name"></result>
            <result property="roleDesc" column="role_desc"></result>
        </collection>
    </resultMap>

    <!-- 查询所有user -->
    <select id="findAll" resultMap="userMap">
        SELECT role.id as rid , role.role_name , role.role_desc, user.*
        FROM  ROLE
        INNER JOIN  USER_ROLE
        ON ( ROLE.id = USER_ROLE.rid)
        INNER JOIN  USER
        ON (USER_ROLE.uid = USER .id);
    </select>
原文地址:https://www.cnblogs.com/mkl7/p/10757470.html