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

news2024/11/15 4:46:46

目录

相关导读

一、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://www.coloradmin.cn/o/464518.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HCL Nomad Web 1.0.7发布和新功能验证

大家好&#xff0c;才是真的好。 要问在HCL Notes/Domino系列产品中&#xff0c;谁更新得最快&#xff0c;那么答案一定是HCL Nomad Web。 你看上图右边&#xff0c;从1.0.1更新到1.0.7&#xff0c;都没花多少时间。 从HCL Nomad Web 1.0.5版本开始&#xff0c;可以支持直接…

逐浪智能时代,网易数帆“重写”低代码

如今&#xff0c;越来越多行业正驶入数字化转型的深水区&#xff0c;如何彻底释放数据生产力&#xff0c;成为所有企业的一道必答题。 4月25日&#xff0c;“网易数帆低代码业务战略发布会”在线上举行。在发布会上&#xff0c;网易数帆发布了CodeWave智能开发平台&#xff0c…

C#之Class的实例化过程

总目录 文章目录 总目录前言一、class的成员二、实例化顺序&#xff08;无继承情况&#xff09;1.声明时进行初始化2.在构造函数中初始化 三、实例化顺序&#xff08;有继承情况&#xff09;结语 前言 在平常开发的过程中&#xff0c;经常需要new 一个class&#xff0c;但是呢…

平安银行广州分行:以金融赋能慈善 释放更大社会效能

4月8日&#xff0c;平安银行广州分行“为爱徒步 欢乐‘益’起行”活动在广州市白云区钟落潭镇云溪湾新乡村示范带圆满举行。本次活动由平安银行广州分行主办&#xff0c;通过白云区供销合作联社组织&#xff0c;在助农过程中&#xff0c;同时公益捐步&#xff0c;助力建设云溪湾…

gitlab部署及整合Jenkins持续构建(三)sonarqube9.9安装和使用(一步一坑)

文章目录 postgresql13.0安装1、配置postgresql数据库2、进入postgresql创建数据库 代码质量管理平台--sonarqube安装1、前置依赖下载2、安装unzip并解压sonarqube并移动到/usr/local&#xff1a;3、修改sonarqube相应的配置4、新增用户&#xff0c;并将目录所属权赋予该用户&a…

资料链接 网络/系统/华为

网络&#xff1a; 缺省路由 https://www.cnblogs.com/ricksteves/p/9702546.html AC热备 快搜预览中心https://search.ruijie.com.cn:8447/rqs/preview.html?wdeHAiOjE1NDU4NzUxNDcsIm5iZiI6MTU0NTYxNTk0N302018092015272000303LqqZuvMhE7V7Ygl6r5RWsTHbWazT BGP https:…

nextjs 错误日志收集

最近用nextjs开发一款房产渠道管理的系统&#xff0c;从开始的项目管理&#xff0c;到价格单管理、订单管理、团队管理、中介管理、个人信息管理...等等功能越来越多的时候&#xff0c;前端偶现的问题不容易发现&#xff0c;造成了不必要的麻烦&#xff0c;就想搞个错误日志收集…

地理信息系统有哪些SCI期刊推荐? - 易智编译EaseEditing

以下是几本地理信息系统领域的SCI期刊推荐&#xff1a; International Journal of Geographical Information Science: 这是一个国际性的期刊&#xff0c;它涵盖了地理信息科学的所有领域&#xff0c;包括地图学、遥感、空间分析、地理信息系统、地理信息技术、地球信息学等等…

被chatGPT割了一块钱韭菜

大家好&#xff0c;才是真的好。 chatGPT热度一直上升&#xff0c;让我萌生了一个胆大而创新的想法&#xff0c; 把chatGPT嵌入到Notes客户机中来玩。 考虑到我已经下载了一个chatGPT的Notes应用&#xff08;请见《ChatGPT APIs for HCL DOMINO》&#xff09;&#xff0c;想着…

Shell编程之条件语句

目录 一、条件测试 1&#xff09;test命令 ​编辑 2&#xff09;文件测试 常用的测试操作符 ​编辑 4&#xff09;整数值比较 常用的测试操作符 6&#xff09;逻辑测试 常用的测试操作符 7&#xff09;三元运算符 二、if语句 1&#xff09;单分支结构 2&#xff09…

时序预测 | MATLAB实现WOA-GRU鲸鱼算法优化门控循环单元时间序列预测

时序预测 | MATLAB实现WOA-GRU鲸鱼算法优化门控循环单元时间序列预测 目录 时序预测 | MATLAB实现WOA-GRU鲸鱼算法优化门控循环单元时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 MATLAB实现WOA-GRU鲸鱼算法优化门控循环单元时间序列预测 基于鲸鱼算法优化门…

必须要知道的hive调优知识(下)

Hive如果不用参数调优&#xff0c;在map和reduce端应该做什么 1、map阶段优化 Map阶段的优化&#xff0c;主要是确定合适的map数。那么首先要了解map数的计算公式 num_reduce_tasks min[${hive.exec.reducers.max}, (${input.size}/${hive.exec.reducers.bytes.per.reducer…

软件测试:测试一个网站

一、软件测试的原则 1、软件测试应尽早执行&#xff0c;并贯穿于整个软件生命周期 2、软件测试应追溯需求 3、测试应由第三方来构造 4、穷举测试是不可能的,要遵循 Good-enough 原则 5、必须确定预期输出&#xff08;或结果&#xff09; 6、必须彻底检查每个测试结果 7、…

常见电路20问,看看你能回答多少

1、什么是电路&#xff1f; 电路是由电子元件、导线和其他元件组成的路径&#xff0c;可以控制电子流的流动。电路可以用于将电能转化为其他形式的能量&#xff0c;例如光能、声能、机械能等等。电路还可以用于控制电子设备的操作&#xff0c;例如计算机、通信设备、车辆控制等…

来字节跳动实习,有机会发Nature子刊

来字节跳动实习&#xff0c;还能有机会发 Nature 子刊&#xff1f; 没错&#xff0c;ByteDance Research 与北京大学物理学院陈基课题组合作的一项研究近期登上了国际顶级刊物 Nature Communications。作者之中&#xff0c;共同一作伟中就是字节跳动的实习生同学&#xff0c;来…

python数据分析:人口普查可视化,看看哪个地区人口最多

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 今天案例难度指数: ☆☆☆ 准备 环境使用&#xff1a; 在开始写我们的代码之前&#xff0c;我们要准备好运行代码的程序 Anaconda (python3.9) –> 识别我们写的代码 开发工具&#xff1a; jupyter notebook –> 代…

ChatGPT在智能客服产品落地探讨

AI语言模型中的ChatGPT近期在互联网平台上引起了广泛的讨论。那么&#xff0c;如果想将这个大型语言模型应用在智能客服产品中&#xff0c;或者将其在ToB SaaS应用软件领域落地&#xff0c;应该采用哪种构建策略&#xff1f; 现在ChatGPT这个大型语言模型已经在各种平台获得了广…

初学Python来用它制作一个简单的界面

前言 很多刚开始学习python的宝子&#xff0c;就想着自己开始琢磨一些界面&#xff0c;但是吧很多都是有点难度的&#xff0c;自己又琢磨不透&#xff0c;只能把代码复制粘贴运行 现在就带你们来了解一个制作简单界面的代码 ttkbootstrap 是一个基于 tkinter 的界面美化库&am…

CMake自动按目录结构编译Protobuf代码

在使用CMake构建C项目时&#xff0c;如果有使用Protobuf&#xff0c;CMake提供了一个FindProtobuf.cmake模块来处理PB&#xff0c;其使用方法如下&#xff1a; find_package(Protobuf REQUIRED) protobuf_generate_cpp(GENERATED_SRC GENERATED_HEADER "pb/t.proto"…