MyBatis 的一对一,多对多

一、概述

MyBatis 的一对一、多对多,主要就是 resultMap 两个属性的使用,而一对多和多对一都是相互的,只是站的角度不同:

  • 【一对多】association:一个复杂的类型关联。许多结果将包成这种类型
  • 【多对多】collection:复杂类型的集合

二、实例

以员工管理系统为例,说明两个属性的使用方法。

  • department 和 user,是一对多关系,一个部门可以拥有多个员工。
  • role 和 user 是多对多关系,一个角色可能有多个员工,而一个员工也可能有多个角色。而要实现多对多,在程序中则是拆分成两个一对多,详情见下面的实体类注释。

1️⃣User

@Data
public class User {

    private Integer id;

    private String username;
    
    private String address;

    //多对一,一个部门多个员工
    private Department dept;

    //一对多,一个用户可能有多个角色。
    private List<Role> roles;

    public User() {
    }
}

2️⃣Role

@Data
public class Role {

    Integer roleId;

    String roleName;

    //一对多,1个角色也可能被多个用户拥有,所以是list
    private List<User> users;

}

3️⃣Department

@Data
public class Department {

    Integer deptId;

    String deptName;

    //1对多,1个部门多个用户
    List<User> users;

}

4️⃣UserMapper.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.xxp.dao.UserDao">

    <resultMap id="user" type="com.xxp.object.userManagement.User">
        <id property="id" column="user_id"></id>
        <result property="username" column="user_name"></result>
        <result property="address" column="user_address"></result>
        <!-- 【一对一】association 标签对应user中的dept成员变量的属性。-->
        <association property="dept" javaType="com.xxp.object.userManagement.Department">
            <result property="deptName" column="dept_name"></result>
        </association>
        <!-- 【多对多】 collection代表集合 roles代表User中成员变量的名字 -->
        <collection property="roles" ofType="com.xxp.object.userManagement.Role">
            <id property="roleId" column="role_id"></id>
            <result property="roleName" column="role_name"></result>
        </collection>
    </resultMap>

    <!-- 一对一 -->
    <select id="queryOneToOne" resultMap="user">
        select u.*,d.dept_name from t_user u , t_department d where u.dept_id = d.dept_id
    </select>


    <!-- 多对多 -->
    <select id="queryManyToMany" resultMap="user">
        select * from t_user u
        left join t_user_role ur on u.user_id=ur.uid
        left join t_role r on ur.rid=r.role_id
    </select>

</mapper>

不管是一对多、多对一,还是多对多,只需要知道这两个属性哪个代表多哪个代表一,就可以很好的在实体的mapper文件中配置出来。

  • 9
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

JFS_Study

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

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

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

打赏作者

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

抵扣说明:

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

余额充值