阅读本博文需要有基础的mybatis以及mybatis plus知识,如果没有建议您了解相关的内容

本项目使用的是springboot构建的,数据库字段命名不严谨仅做演示测试使用,本文不做相关源码的解析只做功能使用讲解

相对于mybatis来说 plus用起来真的很舒服,单表查询crud,以及分页功能真的如丝般顺滑,使用方法就不再一一赘述献丑了,因为查询了很多资料各种方法都有甚至可以使用注解来进行查询,但是我认为这样不便于管理,因此没有找到对我有用的相关连表,关联查询的方法,所以自己只能退而求次用mybatis的原始方法来做连表查询仅供参考,如果您有更好的特别欢迎您分享。

本篇文章讲的是如何来做一对多关系的查询,使用的是xml来配置相关查询语句。

我们单表查询的时候BaseMapper<T>基本的功能都实现了,同时mybatis plus的条件构造器QueryWrapper 可以帮助我们构建各种条件,如果特别复杂那就得手写了。

以学生,老师为例老师对学生为一对多,学生对老师也是一对多(这里只做老师的例子)

我的实体实现了Serializable接口这个看你个人的需求,在这里我重写了toString 方法,目的是做测试打印的,实际开发当中作为一个有工作经验的coder来说肯定知道不要重写tostring

老师实体的第4行代码代码我注释了,具体原因后续会讲。

 1 @TableName(value = "sys_teacher")
2 public class Teacher implements Serializable {
3 @TableId(value = "pk_id" ,type = IdType.AUTO)
4 // @TableField(value = "pk_id")
5 private long id;
6 @TableField(value = "t_name")
7 private String name;
8 private String sex;
9 private String position;
10 @TableField(exist = false)
11 private List<Student> studentList;
12
13
14 public Teacher() {
15 }
16
17 public long getId() {
18 return id;
19 }
20
21 public void setId(long id) {
22 this.id = id;
23 }
24
25 public String getName() {
26 return name;
27 }
28
29 public void setName(String name) {
30 this.name = name;
31 }
32
33 public String getSex() {
34 return sex;
35 }
36
37 public void setSex(String sex) {
38 this.sex = sex;
39 }
40
41 public String getPosition() {
42 return position;
43 }
44
45 public void setPosition(String position) {
46 this.position = position;
47 }
48
49 @Override
50 public String toString() {
51 return "Teacher{" +
52 "id=" + id +
53 ", name='" + name + '\'' +
54 ", sex='" + sex + '\'' +
55 ", position='" + position + '\'' +
56 ", studentList=" + studentList +
57 '}';
58 }
59 }

学生实体

 1 @TableName(value = "sys_student")
2 public class Student implements Serializable {
3 @TableId(type = IdType.AUTO)
4 private long id;
5
6 private String name;
7 private String sex;
8 @TableField(value = "class_no")
9 private String classNo;
10 private int grade;
11
12 public Student() {
13 }
14
15 public int getGrade() {
16 return grade;
17 }
18
19 public void setGrade(int grade) {
20 this.grade = grade;
21 }
22
23 public long getId() {
24 return id;
25 }
26
27 public void setId(long id) {
28 this.id = id;
29 }
30
31 public String getName() {
32 return name;
33 }
34
35 public void setName(String name) {
36 this.name = name;
37 }
38
39 public String getSex() {
40 return sex;
41 }
42
43 public void setSex(String sex) {
44 this.sex = sex;
45 }
46
47 public String getClassNo() {
48 return classNo;
49 }
50
51 public void setClassNo(String classNo) {
52 this.classNo = classNo;
53 }
54
55 @Override
56 public String toString() {
57 return "Student{" +
58 "id=" + id +
59 ", name='" + name + '\'' +
60 ", sex='" + sex + '\'' +
61 ", classNo='" + classNo + '\'' +
62 ", grade=" + grade +
63 '}';
64 }
65 }

数据库截图

老师表

学生表

中间表

在这里我们需要查询老师多对应的学生列表,因为数据库字段里面不包含学生,如果单独查询老师我使用了@TableField(exist = false) 不让属性名作为数据库字段查询,否则映射会出错

具体错误我就 不再演示了,下面是.xml的配置以教师的xml来举栗子,大家可以看到,这里的配置其实和mybatis一样,如果使用xml配置,字段名和属性名一致可以 不做配置,如果不一样那么就必须做关系映射

 1 <?xml version="1.0" encoding="UTF-8" ?>
2 <!DOCTYPE mapper
3 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
4 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
5 <mapper namespace="com.ls.springboot.mp.mapper.ITeacherMapper">
6 <resultMap id="teacherRM" type="Teacher">
7 <id property="id" column="pk_id"/>
8 <!--<result property="name" column="name"/>
9 <result property="sex" column="sex"/>
10 <result property="position" column="position"/>-->
11
12 <collection property="studentList" column="pk_id" select="findStudentListById"></collection>
13 </resultMap>
14 这是关联查询的sql和mybatis一样
15 <select id="findInfo" resultMap="teacherRM">
16
17 select * from sys_teacher
18 </select>
19 <select id="findStudentListById" parameterType="int" resultType="Student">
20
21 SELECT s.* from sys_teacher_student m LEFT JOIN sys_student s
22 on s.id=m.student_id WHERE m.teacher_id=#{id}
23 </select>
24 </mapper>

这里和mybatis的查询方式一样,8-10行注释的地方表示可以省略,如果实体的属性名和数据库表的字段不一致那么在xml里面就不能省略否则出现无法映射的情况

例如在xml未做name的映射则会出现这样的情况

而加上

<result property="name" column="t_name"/>
则会完成映射,我们使用单表查询的时候是不用考虑映射的情况plus会自动去映射

至于为什么要在xml里配置 <id property="id" column="pk_id"/>,因为如果不做配置的话 做连表查询的时候会将id传给studentList,而实体本身就不能获取到id了

1 <!--<id property="id" column="pk_id"/>-->
2 注释掉之后 查看结果

如果恢复的话则可以完全查出相应的内容

3     @TableId(value = "pk_id" ,type = IdType.AUTO)
4 // @TableField(value = "pk_id")
由于我没有仔细去阅读相关文档,在做主键的字段映射的时候以为TableId 和 TableField 可以同时使用,
结果在后续的测试当中发现两者不能同时使用,即使使用之后TableField 也不会起作用,因为@TableId提供了value 的属性 ,这是慕课老师的解答印证了我的观点

mybatis plus 一对多,多表联查的使用小记的更多相关文章

  1. Mybatis学习——一对多关联表查询

    1.实体类 public class Student { private int id; private String name; } public class Classes { private i ...

  2. mybatis-plus注解版实现多表联查(sql)

    mybatis注解版实现多表联查 需求: 用户有角色,角色有权限,需要一次取用户信息包含角色信息及其对应权限 实体类: package cn.zytao.taosir.common.model.use ...

  3. 【mybatis】mybatis多表联查,存在一对多关系的,实体中使用List作为字段接收查询结果的写法

    实体如下: IntegralGoods  积分商品 IntegralGoodsImg 积分商品图片 ShelfLog 积分商品自动上架记录 IntegralGoods :IntegralGoodsIm ...

  4. Mybatis中多表联查,查询出来的字段出现重名,造成数据异常的解决方法!

    在做一对多出现的问题,引发的思考:当数据库表中,主表的主键id和明细表的中的字段名相同时怎么办?Mybatis进行自动映射赋值的时候会不会出现异常?                      注意:M ...

  5. mybatis.net 多表联查

    mybatis.net针对多表联查,其实不用讲联查出的所有的列全部做一个新的resultMap,我们完全可以通过集成关系来实现,真是上一次说的懒加载,在一定程度上可以提高其性能,但这并不是说懒加载性能 ...

  6. 使用mybatis多表联查的时候结果异常及springmvc的理解

    今天使用mybatis多表联查的时候,在dos窗口查询时可以出结果集,但是使用mybatis查询的时候最后返回的结果只有最后一个结果 然后研究了半天没弄出来,后来无意中发现添加了最外层从表的ID字段后 ...

  7. mybatis的一对多,多对一,以及多对对的配置和使用

    1.本文章是无意中看见易百教程的Mybatis教程才注意到这个问题,平时都仅仅是在用CRUD,忽略了这方面的问题,真实十分羞愧   2.首先我们开始对mybatis的一对多的探究   根据这个应用场景 ...

  8. Mybatis基于注解实现多表查询

    对应的四种数据库表关系中存在四种关系:一对多,多对应,一对一,多对多.在前文中已经实现了xml配置方式实现表关系的查询,本文记录一下Mybatis怎么通过注解实现多表的查询,算是一个知识的补充. 同样 ...

  9. mybatis进阶案例之多表查询

    mybatis进阶案例之多表查询 一.mybatis中表之间的关系 在数据库中,实体型之间的关系主要有如下几种: 1.一对一 如果对于实体集A中的每一个实体,实体集B中至多有一个(也可以没有)实体与之 ...

随机推荐

  1. 【mysql】mysql逻辑框架简介及show profile说明

    1.mysql逻辑框架简介 和其它数据库相比,MySQL 有点与众不同,它的架构可以在多种不同场景中应用并发挥良好作用.主要体现在存储引擎的架构上,插件式的存储引擎架构将查询处理和其它的系统任务以及数 ...

  2. SpringBoot配置Cors跨域请求

    一.同源策略简介 同源策略[same origin policy]是浏览器的一个安全功能,不同源的客户端脚本在没有明确授权的情况下,不能读写对方资源. 同源策略是浏览器安全的基石. 什么是源 源[or ...

  3. Spring详解(二)------注解配置IOC

    @Configuration:告诉Spring这是一个配置类 @Bean("person")-->作用于方法:给容器中注册一个Bean;类型为返回值的类型 @Componen ...

  4. 输入npm install 报错node-sass@4.13.0 postinstall:`node scripts/build.js` Failed at the node-sass@4.13.0

    这个是因为sass安装时获取源的问题,先修改sass安装的源,再运行npm install就成功了 npm config set sass_binary_site=https://npm.taobao ...

  5. Int 2e 与 Sysenter区别

    参考:张银奎<软件调试>第八章 Int 2e: Windows将2e号向量专门用作系统调用,在启动早起初始化中断描述表时便注册好了适合的服务例程.因此当NtDll中的NtReadFile发 ...

  6. validity属性返回对象中的属性值

  7. 微信小程序的button按钮设置宽度无效

    亲,你是不是也遇到了微信小程序的button按钮设置宽度无效.让我来告诉你怎么弄 方法1. 样式中加入!important,即:width: 100% !important; wxss代码示例 1 2 ...

  8. J2EE之DAO设计模式及简单实现

    JAVAEE(Java Enterprise Edition ) 模式 : DAO模式 因此在了解DAO模式之前,我们先来学习一下Java EE的体系结构: (一)JavaEE体系结构 客户端: 客户 ...

  9. vue 嵌入倒计时组件( 亲测可用 )

    由于花费了我不少时间才找到的组件,所以记录一下,后面方便自己好找一些,也算是分享出来给各位前端一起用. npm 下载npm install vue2-flip-countdown --save tem ...

  10. 源码解析Spring AOP的加载与生效

    本次博主主要进行Spring AOP这里的解析,因为在工作中使用后,却不知道背后的实现原理并在使用的过程中发现了一些认知缺陷,所以决定写这么一篇文章以供大家参考参考,进入正题. 本次博主使用了@Asp ...