如何使用MyBatis注解实现多表查询

大家好,当我想进行多个表进行查询的时候,我们通常是用SQL语句,join把两个表连到一起。

但是在SpringBoot框架中,每个实体类和表的元素是一一对应的,一个实体类没有另一个实体类的元素,两个实体类连起来,也无法渲染连接起来的数据。

为了解决这个问题,MyBatis提出了多表查询,能够大大简化对多表查询的操作

比如我有两张表,一张是学生表(学号,姓名,班级) 一张是学生校园卡表(学号,余额)

package com.example.sc.entity;

import lombok.Data;

@Data
public class Student {
    private String id;
    private String name;
    private String classes;
}

package com.example.sc.entity;


import lombok.Data;

@Data
public class StudentMoney {
    private String id;
    private String money;
}


现在我想查询学生的学号,姓名,余额。

但是他们分别在不同的表内,如果强行连接,实体类没有元素

我们希望在进行查询学生表的时候,通过学生表的学号,到学生校园卡表去查询学生的余额

此时我们可以在学生表中,直接加入学生校园卡的类。

当我们查询余额时,直接把余额放到这个类中。

package com.example.sc.entity;


import lombok.Data;

@Data
public class Student {
    private String id;
    private String name;
    private String classes;

    //加入学生校园卡类
    private StudentMoney studentMoney;
    
}

我们创建了学生校园卡类,这个类需要根据学生表的学号,去学生校园卡查询余额信息。

所以我们先要到学生校园卡的Mapper中定义SQL语句

 @Select("select * from student_money where id = #{id}")
    StudentMoney find(String id);

最后就可以到学生表的Mapper进行查询了
但由于我们在学生的实体类中添加了学生表中不存在的元素,所以要重新构造
此时我们将刚刚我们导入学生实体类的studentMoney变量,和刚刚我们写的SQL语句进行绑定

    @Select("select * from student")
    @Results({

            @Result(property = "id",column = "id"),
            @Result(property = "name",column = "name"),
            @Result(property = "classes",column = "classes"),
            //property表示实体类的名字 column 表示传入的参数 
            @Result(property = "studentMoney",column = "id",one=@One(select = "com.example.sc.mapper.StudentMoneyMapper.find"))
    })
    List<Student> find();

其中property表示实体类中实体的名字
column表示传入的参数

因为学生表和一卡通表是一对一关系,所以用@One表示
同时注意实体类也应该选择正确的数据类型
一对多用@Many表示,实体类也要用List<>的形式

这样操作我们会发现,我们在查询学生时,学生的余额信息已经储存到studentMoney类中了

多表查询的好处在订单查询、博客查询、涉及到复杂的表的操作时,能够大大简化操作。

MyBatisPlus目前暂不支持多表查询技术,所以要用传统的xml或者注解来进行实现。
当需要多表查询和MyBatisPlus复用的时候,要声明表内不存在的元素

package com.example.sc.entity;

import com.baomidou.mybatisplus.annotation.TableField;
import lombok.Data;

@Data
public class Student {
    private String id;
    private String name;
    private String classes;
    
    @TableField(exist = false)
    private StudentMoney studentMoney;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值