MyBatis 学习(五) 一对一映射 一对多映射

本文详细讲解了MyBatis中的一对一和一对多映射关系,通过案例分析了从订单和用户角度看待这两种关系,并给出了相应的SQL语句示例。在一对一映射中,以订单为主,使用resultMap在orders中设置user变量。而在一对多映射中,以用户为主,userbean中包含一个orders的list集合。同时,文章提供了Mapper.xml配置文件及测试代码,帮助理解映射实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

案例使用两张表

一张user用户表
这里写图片描述
这里写图片描述

映射关系分析
首先,站在订单的角度考虑:
一张订单对应一个用户,这是一对一
然后,站在用户的角度考虑:
一个用户可以有多个订单,这是一对多

那么SQL语句该如何写?
还记得外联接吗,left/right join
以某张表为主,取出里面所有记录,然后每条记录与另外一张表进行连接
不管能不能匹配上条件,最终都会保留;能匹配,正确保留,不匹配,其他表的字段都置空
也就是说,以哪张表为主,哪张表的记录保留的最完整,另外一张是残缺的,因为有些字段没能和主表匹配上

一对一

以订单为主所以sql语句如下

       select o.* ,
         u.username
         from orders as o left join user as u
         on o.user_id = u.id

下面放案例源码:

写两个bean
user 、orders
在一对一中,为表示两者关系,在orders中存一个user变量 表示一对一
user

public class User {

    private int id ;
    private String username ;
    private Date birthday ;
    private String sex ;
    private String address ;


    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public Date getBirthday() {
        return birthday;
    }
    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    @Override
    public String toString() {
        return "User [id=" + id + ", username=" + username + ", birthday=" + birthday + ", sex=" + sex + ", address="
                + address + "]";
    }
}

orders

public class Orders {

    private int id ;
    private int user_id ;
    private Integer number ;
    private Date createtime ;
    private String note ;
    private User user ;


    public User getUser() {
        return user;
    }
    public void setUser(User user) {
        this.user = user;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public int getUser_id() {
        return user_id;
    }
    public void setUser_id(int user_id) {
        this.user_id = user_id;
    }
    public Integer getNumber() {
        return number;
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值