栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

MyBatis 一对多,多对一,多对多

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

MyBatis 一对多,多对一,多对多

一、概述

MyBatis 中的一对多、多对一和多对多,主要就是 resultMap 中:

association:一个复杂的类型关联。许多结果将包成这种类型(一对多)collection:复杂类型的集合(多对一)
这2个属性的使用,而一对多和多对一都是相互的,只是站的角度不同。

实例:
这个实例只说这2个属性的使用方法。

    首先是数据库,以员工管理系统的数据库为例。实体类:
    这里只列要实现映射功能用到的类 user、role、department。

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

@Data
public class User {
    private int user_id;
    private String user_name;
    private String user_gender;
    private String user_email;
    private String user_phone;
    private String user_address;
    private Date user_birthday;
    private int department_id;

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

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

    public User() {
        super();
    }

    public User(String user_name, String user_gender,
            String user_email, String user_phone, String user_address,
            Date user_birthday, int department_id) {
        super();
        this.user_name = user_name;
        this.user_gender = user_gender;
        this.user_email = user_email;
        this.user_phone = user_phone;
        this.user_address = user_address;
        this.user_birthday = user_birthday;
        this.department_id = department_id;
    }
}

2)Role.java

@Data
public class Role {
    private int role_id;
    private String role_name;

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

    public Role() {

    }

    public Role(int role_id, String role_name) {
        super();
        this.role_id = role_id;
        this.role_name = role_name;
    }
    public List getUsers() {
        return users;
    }

    public void setUsers(List users) {
        this.users = users;
    }

    @Override
    public String toString() {
        return "Role [role_id=" + role_id + ", role_name=" + role_name
                + ", users=" + users + "]";
    }
}

3)Department.java

@Data
public class Department {
    private int department_id;
    private String department_name;

    //1对多,1个部门多个用户
    private List users;

    public Department() {
        super();
    }

    public Department(int department_id, String department_name,
            List users) {
        super();
        this.department_id = department_id;
        this.department_name = department_name;
        this.users = users;
    }
    
    public List getUsers() {
        return users;
    }

    public void setUsers(List users) {
        this.users = users;
    }

    @Override
    public String toString() {
        return "Department [department_id=" + department_id
                + ", department_name=" + department_name + ", users=" + users
                + "]"+"n";
    }
}

3.实体类的 mapper 文件
1)UserDepartmentMapper.xml:多对一,多个 user 对应一个 department,使用 association




    
        
        
        
        
        
        
        
        
            
        
            
            
        
    

    
        select u.*,d.department_name from user u left join department d on u.department_id=d.department_id;
    

2)UserMapper.xml:一对多,使用collection,一个user对应多个role,同时也是多对多中user这一方的一对多。如果要实现多对多,还需要完成一个role对应多个user,即完成两个一对多,写法同下。





    
    
        
        
        
        
        
        
        
        
    

    
    
        
        
            
            
        
    

    


        select u.*,r.* from
        user u left join user_role ur on u.user_id=ur.user_id
        left join role r
        on r.role_id=ur.role_id;
    

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/769230.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号