当前位置:首页 » 《随便一记》 » 正文

Mybatis关联查询【附实战案例】

25 人参与  2023年05月01日 19:05  分类 : 《随便一记》  评论

点击全文阅读


目录

相关导读

一、Mybatis一对一关联查询

1. 新增持久层接口方法

2. 新增映射文件对应的标签

3. 新增测试方法

4. 运行效果

二、Mybatis一对多关联查询

1. 新增持久层接口方法

2. 新增映射文件对应的标签

3. 新增测试方法

4. 运行效果

三、Mybatis多对多关联查询

1. 新增持久层接口方法

2. 新增映射文件对应的标签

3. 新增测试方法

4. 运行效果

四、进阶查询班级信息

1. 新增持久层接口方法

2. 新增映射文件对应的标签

3. 新增测试方法

4. 运行效果


相关导读

Mybatis专栏:

Mybatis系列专栏MyBatis入门配置
Mybatis入门案例【超详细】
MyBatis配置文件 —— 相关标签详解
Mybatis模糊查询——三种定义参数方法和聚合查询、主键回填
Mybatis动态SQL查询 --(附实战案例--8888个字--88质量分)
Mybatis分页查询——四种传参方式
Mybatis一级缓存和二级缓存(带测试方法)
Mybatis分解式查询
Mybatis关联查询【附实战案例】
MyBatis注解开发---实现增删查改和动态SQL
MyBatis注解开发---实现自定义映射关系和关联查询

一、Mybatis一对一关联查询

        查询学生时,将关联的一个班级对象查询出来,就是一对一关联查询。这里还新增了几个实体类

新增Classes实体类

package com.example.pojo;import java.util.List;public class Classes {    private int cid;    private String className;    private List<Student> studentList;    private List<Teacher> teacherList;    public int getCid() {        return cid;    }    public void setCid(int cid) {        this.cid = cid;    }    public String getClassName() {        return className;    }    public void setClassName(String className) {        this.className = className;    }    public List<Student> getStudentList() {        return studentList;    }    public void setStudentList(List<Student> studentList) {        this.studentList = studentList;    }    public List<Teacher> getTeacherList() {        return teacherList;    }    public void setTeacherList(List<Teacher> teacherList) {        this.teacherList = teacherList;    }    @Override    public String toString() {        return "Classes[ " +                "cid=" + cid +                ", className='" + className + '\'' +                ", studentList=" + studentList + '\'' +                ", teacherList=" + teacherList +                " ]";    }}

新增Student实体类

package com.example.pojo;public class Student {    private int sid;    private String name;    private int age;    private String sex;    private Classes classes;    public int getSid() {        return sid;    }    public void setSid(int sid) {        this.sid = sid;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }    public String getSex() {        return sex;    }    public void setSex(String sex) {        this.sex = sex;    }    public Classes getClasses() {        return classes;    }    public void setClasses(Classes classes) {        this.classes = classes;    }    @Override    public String toString() {        return "Student[ " +                "sid=" + sid +                ", name='" + name + '\'' +                ", age=" + age +                ", sex='" + sex + '\'' +                ", classes=" + classes +                " ]";    }}

新增Teacher实体类 

package com.example.pojo;import java.util.List;public class Teacher {    private Integer tid;    private String tname;    private List<Classes> classes;    public Integer getTid() {        return tid;    }    public void setTid(Integer tid) {        this.tid = tid;    }    public String getTname() {        return tname;    }    public void setTname(String tname) {        this.tname = tname;    }    public List<Classes> getClasses() {        return classes;    }    public void setClasses(List<Classes> classes) {        this.classes = classes;    }    @Override    public String toString() {        return "Teacher[ " +                "tid=" + tid +                ", tname='" + tname + '\'' +                ", classes=" + classes +                " ]";    }}

1. 新增持久层接口方法

package com.example.mapper;import com.example.pojo.Student;import java.util.List;public interface StudentMapper {    List<Student> findAll();}

2. 新增映射文件对应的标签

StudentMapper.xml映射文件

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mapper        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"        "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.example.mapper.StudentMapper">    <resultMap id="studentMapper" type="com.example.pojo.Student">        <!-- 主键列 -->        <id property="sid" column="sid"></id>        <!-- 普通列 -->        <result property="name" column="name"></result>        <result property="age" column="age"></result>        <result property="sex" column="sex"></result>        <!-- 一对一对象列 property:属性名 column:关联列名 javaType:对象类型 -->        <association property="classes" column="classId" javaType="com.example.pojo.Classes">            <!-- 关联对象主键列 -->            <id property="cid" column="cid"></id>            <!-- 关联对象普通列 -->            <result property="className" column="className"></result>        </association>    </resultMap>    <!-- 多表查询,级联查询学生和其他班级 -->    <select id="findAll" resultMap="studentMapper">        select * from student left join classes on student.classId = classes.cid;    </select></mapper>

3. 新增测试方法

    @Test    public void testFindAll(){        StudentMapper studentMapper = session.getMapper(StudentMapper.class);        List<Student> all = studentMapper.findAll();        all.forEach(System.out::println);    }

4. 运行效果

Ok,从运行效果来看确实查询出来每个学生对应的班级了 

二、Mybatis一对多关联查询

查询班级时,将关联的学生集合查询出来,就是一对多关联查询。

1. 新增持久层接口方法

package com.example.mapper;import com.example.pojo.Classes;import java.util.List;public interface ClassesMapper {    List<Classes> findAll();}

2. 新增映射文件对应的标签

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mapper        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"        "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.example.mapper.ClassesMapper">    <resultMap id="classesMapper" type="com.example.pojo.Classes">        <id property="cid" column="cid"></id>        <result property="className" column="className"></result>        <!-- 集合列 property:属性名  column:关联列名  ofType:集合的泛型 -->        <collection property="studentList" column="classId" ofType="com.example.pojo.Student">            <id property="sid" column="sid"></id>            <result property="name" column="name"></result>            <result property="age" column="age"></result>            <result property="sex" column="sex"></result>        </collection>    </resultMap>    <!-- 多表查询,级联查询班级和它的学生 -->    <select id="findAll" resultMap="classesMapper">        select * from classes left join student on classes.cid = student.classId;    </select></mapper>

3. 新增测试方法

// 测试查询一对多关联查询    @Test    public void testFindAllClasses(){        ClassesMapper classesMapper = session.getMapper(ClassesMapper.class);        List<Classes> all = classesMapper.findAll();        all.forEach(System.out::println);    }

4. 运行效果

OK,观察运行效果,确实是将每个班级对应的学生都查询出来了。 

三、Mybatis多对多关联查询

MyBatis多对多关联查询本质就是两个一对多关联查询。

例如有老师类和班级类:

一个老师对应多个班级,也就是老师类中有一个班级集合属性。

一个班级对应多个老师,也就是班级类中有一个老师集合属性。

本次我们的目的就是查询各个老师对应所教的的班级,并且各个班级的老师也一并查询出来,这里有点拗口。稍加理解即可。

1. 新增持久层接口方法

package com.example.mapper;import com.example.pojo.Teacher;import java.util.List;public interface TeacherMapper {    List<Teacher> findAll();}

2. 新增映射文件对应的标签

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mapper        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"        "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.example.mapper.TeacherMapper">    <resultMap id="teacherMapper" type="com.example.pojo.Teacher">        <id property="tid" column="tid"></id>        <result property="tname" column="tname"></result>        <collection property="classes" column="tid" ofType="com.example.pojo.Classes">            <id property="cid" column="cid"></id>            <result column="className" property="className"></result>        </collection>    </resultMap>    <select id="findAll" resultMap="teacherMapper">        select * from teacher left join classes_teacher            on teacher.tid = classes_teacher.tid            left join classes            on classes_teacher.cid = classes.cid    </select></mapper>

3. 新增测试方法

// 测试多对多关联查询    @Test    public void testFindAllTeacher(){        TeacherMapper teacherMapper = session.getMapper(TeacherMapper.class);        List<Teacher> all = teacherMapper.findAll();        all.forEach(System.out::println);    }

4. 运行效果

        OK,这里也是可以查询出每个老师教的班级,一个班级有多个老师,一个老师可以对应多个 班级,这就是多对多查询

四、进阶查询班级信息

        因为在前面,我们查询所有班级信息的时候,老师列表是空的,现在如果想查询班级时,将关联的老师集合查询出来,只需要修改班级映射文件的Sql语句和 <resultMap> 即可:

1. 新增持久层接口方法

List<Classes> findAll1();

2. 新增映射文件对应的标签

    <!--如果想查询班级时,将关联的老师集合查询出来,只需要修改班级映射文件的Sql语句和 <resultMap> 即可:-->    <resultMap id="classesMapper1" type="com.example.pojo.Classes">        <id property="cid" column="cid"></id>        <result property="className" column="className"></result>        <!-- 集合列 property:属性名  column:关联列名  ofType:集合的泛型 -->        <collection property="studentList" column="classId" ofType="com.example.pojo.Student">            <id property="sid" column="sid"></id>            <result property="name" column="name"></result>            <result property="age" column="age"></result>            <result property="sex" column="sex"></result>        </collection>        <collection property="teacherList" column="cid" ofType="com.example.pojo.Teacher">            <id property="tid" column="tid"></id>            <result property="tname" column="tname"></result>        </collection>    </resultMap>    <!-- 多表查询,级联查询班级和它的学生 -->    <select id="findAll1" resultMap="classesMapper1">        select * from classes            left join student                on classes.cid = student.classId            left join classes_teacher                on classes.cid = classes_teacher.cid            left join teacher                on classes_teacher.tid = teacher.tid;    </select>

3. 新增测试方法

    @Test    public void testFindAllClasses1(){        ClassesMapper classesMapper = session.getMapper(ClassesMapper.class);        List<Classes> all = classesMapper.findAll1();        all.forEach(System.out::println);    }

4. 运行效果

OK,可以看到查询班级信息的时候确实将老师列表也查询出来了。


点击全文阅读


本文链接:http://zhangshiyu.com/post/60199.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

最新文章

  • [丈夫的初恋成了我们的邻居后]全文+后续_方欣墨周司瑾月月小说无删减版在线免费阅读
  • 全文也曾偷藏欢喜结局+番外(乔喜商凛乔雪眠)列表_全文也曾偷藏欢喜结局+番外
  • (番外)+(全书)(贺景川宋南乔)_爱也沧沧,恨也沧沧结局+番外列表_笔趣阁(贺景川宋南乔)完结_(贺景川宋南乔)列表_笔趣阁(爱也沧沧,恨也沧沧结局+番外)
  • [岁月不堪回首]***剧情片段直通车_[吴承华老公宋兰香]人气小说未删减节选
  • 爱也沧沧,恨也沧沧章节限时抢先看‌_「贺景川宋南乔贺景明」小说精彩章节免费试读
  • 被逼退婚后,我成了极道女王小说节选免费试读_「梁书沈漓冷笑」后续更新+番外
  • 人皇觉醒,屠天灭神限时免费章节抢先看_[墨如渊苏明明薇]小说精彩章节免费试读
  • (番外)+(全书)乔喜商凛(也曾偷藏欢喜结局+番外)全书在线_(乔喜商凛)列表_笔趣阁(也曾偷藏欢喜结局+番外)
  • 「为你归雪满舟」精彩章节试读_谢景期俞诗俞家独家章节限时试读
  • (番外)+(全书)男友帮假千金冒充我,我靠弹幕杀疯了(陈子期林依然+番外+全书)_(男友帮假千金冒充我,我靠弹幕杀疯了+番外+全书)免费_笔趣阁(陈子期林依然)
  • (番外)+(全书)商凛乔喜乔雪眠(乔喜商凛乔雪眠+后续+结局)_商凛乔喜乔雪眠免费列表_笔趣阁(乔喜商凛乔雪眠+后续+结局)
  • 许我三千繁星愿结局+番外(楚砚风慕星眠)完结_(许我三千繁星愿结局+番外)列表_笔趣阁(楚砚风慕星眠)

    关于我们 | 我要投稿 | 免责申明

    Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1