Mybaits中collection的用法详解

2023-11-15

作用:在Mybaits中collection标签是用来实现连表查询的。
使用的场景:collection的使用场景为1:n和n:n两种情况。
添加的内容:使用collection的时候需要在类中添加关联集合(查询哪个类就在哪个类中添加)。

一、第一种情况:
一对多: 一个班级有多个学生,一个学生只能有一个班级
查询信息:查询班级信息的时候返回学生信息

1、查询班级信息的时候返回学生信息,所以应该在班级类中添加一个学生的信息作为两个表之间的关联,又因为一个班级对应多个学生,所以关联的字段应该是集合。
这里的@Data注解采用了lombok,@JsonFormat和@DateTimeFormat注解是将时间属性的入参和出参格式化,班级类如下:

@Data
public class ClassInfo {
    private Long id;
    private Long classInfoId;
    private String classInfoName;
    @JsonFormat(pattern="yyyy-MM-dd")
    @DateTimeFormat(pattern="yyyy-MM-dd")
    private LocalDateTime classInfoCreateTime;

    private List<Student> studentList;//关联属性:集合
}

学生类没有任何变动:

@Data
public class Student {
    private Long id;
    private Long studentId;
    private String studentName;
    private Long studentClassInfoId;
    private Integer studentSex;
}

2、ClassIndoMapper.xml中的代码如下:

<resultMap id="BaseResultMapWithStudentList" type="com.example.demo.entity.ClassInfo">
    <id column="id" jdbcType="BIGINT" property="id" />
    <result column="class_info_id" jdbcType="BIGINT" property="classInfoId" />
    <result column="class_info_name" jdbcType="VARCHAR" property="classInfoName" />
    <result column="class_info_create_time" jdbcType="TIMESTAMP" property="classInfoCreateTime" />
    <collection property="studentList" column="class_info_id" select="com.example.demo.mapper.StudentMapper.selectStudentByClassId"/>
</resultMap>

<select id="classInfoSelectAll" resultMap="BaseResultMapWithStudentList">
    select * from class_info
</select>

3、StudentMapper.xml中的代码如下:

<select id="selectStudentByClassId" resultType="com.example.demo.entity.Student">
    select * from student where student_class_info_id = #{id}
</select>

4、ClassInfo的controller层如何调用如下:

@RequestMapping("classInfoSelectAll")
@ResponseBody
public List<ClassInfo> classInfoSelectAll(){
    return classInfoService.classInfoSelectAll();
}

5、查询结果如下图:
在这里插入图片描述
二、第二种情况:
多对多: 一个教师教多个班级,一个班级被多个教师教
查询信息:查询教师信息的时候返回班级信息

1、教师类中添加班级集合(第一种情况中谈到了哦):

@Data
public class Teacher {
    private Long id;
    private Long teacherId;
    private Integer teacherSex;
    private String teacherName;

    private List<ClassInfo> classInfoList;//关联属性:集合
}

班级类没有任何变动:

@Data
public class ClassInfo {
    private Long id;
    private Long classInfoId;
    private String classInfoName;
    @JsonFormat(pattern="yyyy-MM-dd")
    @DateTimeFormat(pattern="yyyy-MM-dd")
    private LocalDateTime classInfoCreateTime;
}

2、TeacherMapper.xml中的代码如下:

<resultMap id="BaseResultMapWithClassInfo" type="com.example.demo.entity.Teacher">
    <id column="id" jdbcType="BIGINT" property="id" />
    <result column="teacher_id" jdbcType="BIGINT" property="teacherId" />
    <result column="teacher_sex" jdbcType="INTEGER" property="teacherSex" />
    <result column="teacher_name" jdbcType="VARCHAR" property="teacherName" />
    <collection property="classInfoList" column="teacher_id" select="com.example.demo.mapper.ClassInfoMapper.selectClassInfoByTeacherId"/>
</resultMap>

<select id="teacherSelectAll" resultMap="BaseResultMapWithClassInfo">
    select * from teacher
</select>

association与collection不同的是,association标签内property属性接受的是对象,而collection标签内property属性接受的是集合。teacher表中的teacher_id作为下一条执行sql的入参,select属性中的内容为下一条sql执行的位置,执行下一条sql后将其结果映射到property属性的classInfoList集合中。

3、ClassInfoMapper.xml中的代码如下:

<select id="selectClassInfoByTeacherId" resultType="com.example.demo.entity.ClassInfo">
    SELECT
     c.*
    FROM
     class_info c
 LEFT JOIN ( SELECT r.* FROM relationship_teacher_class r LEFT JOIN teacher t ON r.teacher_id = t.teacher_id ) x
     ON c.class_info_id = x.class_info_id
    WHERE
     x.teacher_id = #{id}
</select>

这里使用到了left join连表查询,教师和班级是多对多关系,其中关联表作为连接两张表的桥梁。利用入参在关联表中找出相应的班级ID的集合和其对应的教师ID作为一个新表,然后利用班级ID作为连接条件连接新表和班级表查询出班级信息。

4、teacher的controller层如何调用如下:

@RequestMapping("teacherSelectAll")
@ResponseBody
public List<Teacher> teacherSelectAll(){

    return teacherService.teacherSelectAll();
}

5、查询结果如下图:
在这里插入图片描述
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Mybaits中collection的用法详解 的相关文章

随机推荐

  • 对全连接层的理解

    1 1概述 全连接层 Fully Connected Layer 一般位于整个卷积神经网络的最后 负责将卷积输出的二维特征图转化成一维的一个向量 由此实现了端到端的学习过程 即 输入一张图像或一段语音 输出一个向量或信息 全连接层的每一个结
  • url服务器显示错误,服务器地址 (URL) 错误无效错误 - Dynamics 365 Sales

    为 Outlook 配置 时 URL Microsoft Dynamics CRM 无效 错误 3 31 2021 本文内容 本文提供了当您尝试将 Outlook 的 Microsoft Dynamics CRM 连接到您的 Microso
  • st语言编程手册plc_三菱Q系列PLC,ST语言的IF语句、CASE语句指令格式

    IF语句和CASE语句是ST编程语言中的选择 条件 语句的两种形式 1 如果 IF BOOL事件 1 0 那么 THEN 结果 语句 END IF 2 如果 IF BOOL事件 1 0 那么 THEN 结果 语句1 否则ELSE 语句2 E
  • Python 对加减乘除分别封装一个函数进行计算,参数是两个数,返回值是计算结果

    1 对加减乘除分别封装一个函数进行计算 参数是两个数 返回值是计算结果 def add x y param x param y return 返回结果 print x y return add 3 4 def sub x y param x
  • 动态菜单/权限管理的实现

    权限管理 序 现在基本上大大小小的系统都由权限分配这一基础功能 不同的用户看到的界面不一样 能够使用的功能也不会尽然相同 所以我要让我的系统做到超级管理员可以看到 操作所有界面 而新闻管理员只能看到新闻管理模块 仓库管理员只能看到仓库管理模
  • 基于openwrt,aria2下载器安装与配置

    迅雷下载不好用 所以用这个下载器aria2 需要安装软件 在可用软件列表中安装aria2和luci app aria2 安装完后有可能需要重启路由器 需要注意的问题 1 aria2只是一个下载工具 并没有图形界面 2 文件下载的位置 在ar
  • 在传统公司干IT是一种什么体验(六)

    不要轻视任何一家传统公司 传统公司能够在激烈的竞争中活下来 都有自己的绝活 表哥语录 表哥虽然经常吐槽自己的公司 但是大部分都是对传统公司的文化和风格的不适应 任何一家传统公司 能够在长达十几年甚至几十年的市场竞争中活下来 一定有自己的独门
  • 数据库开发之MySql(下)(多表查询)

    多表查询 介绍 多表查询就是指从多张表中查询数据 笛卡尔积 笛卡尔乘积是指在数学中 两个集合A集合 和 B集合的所有组合情况 在多表查询时 需要消除无效的笛卡尔积 怎么做多表查询的需求 要查询的数据涉及到哪些表 找出关联条件 外键 主键 其
  • STM32---独立看门狗

    文章目录 前言 一 看门狗概述 1 背景 2 工作原理 二 使用步骤 1 添加复位检测代码 2 喂狗时间设置 3 喂狗 4 喂狗技巧 三 应用领域 四 源码地址 总结 前言 STM32 独立看门狗 提示 以下是本篇文章正文内容 下面案例可供
  • RuntimeError: expected scalar type Long but found Float

    通过检查打印数据格式 发现数据是 torch int64 将数据转换成 float即可 torch tensor data dtype torch float
  • jwt生成token和验证token以及获取playload的数据,实现token拦截

    jwt实现流程 1 添加依赖
  • 常用性能测试工具介绍

    市面上常用的两款性能测试工具 1 LoadRunner 2 Jmeter Loadrunner 特点 1 工业化的性能测试工具 能支持大量用户 提供详细的报表来提供测试分析的数据 2 支持的协议多 3 使用 C 语言来编写的 优点 1 支持
  • kettle数据迁移

    kettle数据迁移 此处是将mysql数据库中的表修改表名与字段名迁移至另一个mysql数据库 1 kettle安装 1 1 kettle下载 8 3 0 0 371版本 Kettle各个版本下载地址 1 2 下载连接驱动包 mysql驱
  • QT QtableView的使用示例(设置item背景颜色的方法)

    1 创建表格内容 QStandardItemModel m standardItemModel new QStandardItemModel this QStandardItem item new QStandardItem 李四 m st
  • 解析数组里面包含数组的json格式的数据代码

    格式如图所示 操作代码如下 public class ActivityJuankuanInfoPost 获取捐款详情 public static JuankuanInfoMessageActivity applyactivityPost S
  • SmartRefreshLayout 嵌套reycleview 长按排序下拉刷新

    布局文件
  • 如何判断数码管是共阴极还是共阳极

    开发环境 蓝色粗体字为特别注意内容 1 硬件环境 8位数码管 引脚排布如下 方法一 限流电阻 简单 用5V电源接一个限流电阻 假一定个是阳极或是阴极 另一个挨个引脚试就行了 方法二 使用万用表 1 指针表 1 前提是你的万用表最好是用3V以
  • Keil(MDK-ARM)的调试步骤

    Keil MDK ARM 的调试步骤 1 编译 调试 在线调试分类 软件在线调试和硬件在线调试 由于现在硬件成本 较便宜 般我们都使 硬件在线调试 也就是软件直接下载到芯 打开软件 程 gt 编译 gt 下载 gt 调试 如下图1 2 3
  • 计蒜客 挑战难题 第8题:字符串长度

    第8题 字符串长度 内存限制 10000 K 时间限制 1000 ms 在右侧我们给出了一个已经基本完成的程序 读入了一个字符串 调用了一个叫str len的函数来计算这个字符串的长度 并输出 聪明的你应该已经发现了 这个叫str len的
  • Mybaits中collection的用法详解

    作用 在Mybaits中collection标签是用来实现连表查询的 使用的场景 collection的使用场景为1 n和n n两种情况 添加的内容 使用collection的时候需要在类中添加关联集合 查询哪个类就在哪个类中添加 一 第一