大家好,当我想进行多个表进行查询的时候,我们通常是用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;
}