Mybatis 多表查询之多对多

一、需求分析

用户和角色多对多关系模型:用户可以有多个角色,每个角色也可以对应多个用户
在这里插入图片描述
需求:实现查询所有对象,并且加载它所分配的用户信息
分析:查询角色需要用到 role 表,但角色分配的用户信息并不能直接找到用户信息,而是要通过中间表(user_role 表)才能关联到用户信息。
在这里插入图片描述
这里需要获取所有对象及这些对象对应的用户信息,所以采用内部连接

INNER JOIN关键字:选择两个表中具有匹配值的记录。
LEFT JOIN关键字:返回左侧表(表1)中的所有记录,以及右侧表(表2)中的匹配记录。如果没有匹配项,则结果从右侧为NULL。

二、角色实体类

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

在角色实体类中添加了用户的信息,是一种多对多的关系

三、RoleDao 接口

public interface RoleDao {
    /**
     * 查询所有角色
     * @return
     */
    List<Role> findAll();
}

四、RoleDao.xml 配置文件

<mapper namespace="mybatis.dao.RoleDao">

    <!--定义 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>
        <!-- 配置role对象中users集合的映射 -->
        <!--这是一种多对多的映射,选用 collection-->
        <collection property="users" ofType="user">
            <id column="id" property="id"></id>
            <result property="username" column="username"></result>
            <result property="address" column="address"></result>
            <result property="sex" column="sex"></result>
            <result property="birthday" column="birthday"></result>
        </collection>
    </resultMap>

    <!--查询所有对象-->
    <select id="findAll" resultMap="roleMap">
        SELECT r.id rid,r.role_name,r.role_desc,u.* FROM role r
        INNER JOIN user_role ur ON (r.id=ur.rid)
	    INNER JOIN user u ON (ur.uid=u.id)
    </select>
</mapper>

注意这里的Role 表中存在 id 属性,user 表中也存在 id 属性,所以 SQL语句中为 role 中的id 取了别名 rid

五、同理实现User到Role的一对多查询

这里主要在 User 中添加 Role 属性

@Data
public class User implements Serializable{
    private Integer id;
    private String username;
    private Date birthday;
    private String sex;
    private String address;
    /**
     * 多对多的关系映射:一个用户可以拥有多个角色
     */
    private List<Role> roles;
}

然后在 UserDao 中添加 查询所有用户信息(包含角色信息)

    /**
     * 查询所有用户包含角色信息
     * @return
     */
    List<User> findUserRole();

在配置文件 UserDao.xml 中添加相关配置信息:

    <resultMap id="userRoleMap" type="user">
        <id property="id" column="id"></id>
        <result property="username" column="username"></result>
        <result property="address" column="address"></result>
        <result property="sex" column="sex"></result>
        <result property="birthday" column="birthday"></result>
        <!-- 配置user对象中roles集合的映射 -->
        <collection property="roles" ofType="role">
            <id column="rid" property="roleId"></id>
            <result column="role_name" property="roleName"></result>
            <result column="role_desc" property="roleDesc"></result>
        </collection>
    </resultMap>

   <!--根据id查询-->
    <select id="findUserRole" resultMap="userRoleMap">
        SELECT u.*,r.id rid,r.role_name,r.role_desc FROM USER u
        LEFT OUTER JOIN user_role ur ON (ur.uid=u.id)
        LEFT OUTER JOIN role r  ON (r.id=ur.rid)
    </select>

主要注意这里是查询所有用户信息,包括角色信息,所以用了左连接查询操作

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南淮北安

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值