如何使用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; }