Mybatis_07 多对一、一对多处理

从原理到落地:Mamba-YOLOv8 全面实战指南(源码 + 训练 + 部署一次学会) 在目标检测领域,CNN与Transformer的较量从未停歇。本文提出一种革命性的架构——,将状态空间模型(SSM)首次引入YOLO框架。实验表明,该模型在COCO数据集上达到54.3% mAP@0.5,推理速度达89 FPS(RTX 4090),相比原版YOLOv8提升12.7%精度与23%速度。本文将完整揭示其技术原理与工程实现,助您掌握这一前沿技术。 阅读详情

1 . Mybatis多对一

  • 多对一
    • 多个学生对应一个老师
    • 对于学生,就是一个多对一的现象,即从学生关联一个老师。

1.1 数据库设计

  • 测试数据库需要新建两张表,分别是student和teacher表。
CREATE TABLE `teacher`(
	`id` INT(10) NOT NULL,
	`name` VARCHAR(30) DEFAULT NULL,
	PRIMARY KEY (`id`)
	)ENGINE=INNODB DEFAULT CHARSET=utf8;
	
INSERT INTO `teacher`(`id`,`name`) VALUES(1,"许老师");

CREATE TABLE `student`(
	`id` INT(10) NOT NULL,
	`name` VARCHAR(30) DEFAULT NULL,
	`tid` INT(10) DEFAULT NULL,
	PRIMARY KEY (`id`),
	KEY `fktid` (`tid`),
	CONSTRAINT `fktid` FOREIGN KEY (`tid`) REFERENCES `teacher` (`id`)
	)ENGINE=INNODB DEFAULT CHARSET=utf8;

INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('1', '小明', '1');
INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('2', '小红', '1'); 
INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('3', '小张', '1');
 INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('4', '小李', '1'); 
 INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('5', '小王', '1');

在这里插入图片描述

1.2 实体类编写

  1. 老师
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Teacher {
    private int id;
    private String name;
}
  1. 学生
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Student {
    private int id;
    private String name;
    private Teacher teacher;
}

1.3 实体类对应的mapper接口

  1. 老师
public interface TeacherMapper {
}
  1. 学生
public interface StudentMapper {
}

1.4 mapper接口对应的xml文件

  1. 老师
<?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.jiu.mapper.TeacherMapper">

</mapper>

  1. 学生
<?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.jiu.mapper.StudentMapper">

</mapper>

1.5 按查询嵌套处理

  1. 给StudentMapper接口增加方法
public interface StudentMapper {
//    获取所有学生及对应老师的信息
    public List<Student> getStudents();
}
  1. 编写对应的Mapper文件
<!--    需求 : 获取所有学生及对应老师的信息。
    思路
        1.获取所有学生的信息
        2.跟据获取的学生信息的老师ID,获取该老师的信息
        3.这样学生集中应该包含老师,该如何处理
            3.1 做一个结果集映射 : StudentTeacher
            3.2 StudentTeacher结果集的类型为Student
            3.3 学生中老师的属性为teacher,对应数据库中的tid-->

    <select id="getStudents" resultMap="StudentTeacher">
        select *
        from mybatis.student;
    </select>
    <resultMap id="StudentTeacher" type="student">
<!--        association关联属性,property属性名,javaType属性类型,column在多的一方中的列名-->
        <association property="teacher" javaType="Teacher" column="tid" select="getTeacher"/>
    </resultMap>
    <select id="getTeacher" resultType="teacher">
        select *
        from mybatis.teacher
        where id = #{id};
    </select>
  1. 编写完毕,到核心配置文件mybatis-config.xml注册mapper
    <mappers>
        <mapper resource="com/jiu/mapper/StudentMapper.xml"/>
        <mapper resource="com/jiu/mapper/TeacherMapper.xml"/>
    </mappers>
  1. 测试
    @Test
    public void getStudentsTest(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
        List<Student> students = mapper.getStudents();
        students.forEach(System.out::println);
    }

结果如下:
在这里插入图片描述

1.6 按结果嵌套查询

  1. 接口方法编写
public interface StudentMapper {
//    获取所有学生及对应老师的信息
    public List<Student> getStudents();
//    按结果嵌套查询
    public List<Student> getStudents2();
}
  1. 编写对应的Mapper文件
    <select id="getStudents2" resultMap="StudentTeacher2">
        select s.id sid, s.name sname,t.id tid,t.name tname
        from student s,
             teacher t
        where s.tid = t.id;
    </select>
    <resultMap id="StudentTeacher2" type="student">
        <result property="id" column="sid"/>
        <result property="name" column="sname"/>
        <association property="teacher" javaType="teacher">
            <result property="id" column="tid"/>
            <result property="name" column="tname"/>
        </association>
    </resultMap>
  1. 前往核心配置文件注册Mapper(在按查询嵌套查询时已经注册)
  2. 测试
    @Test
    public void getStudentsTest2(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
        List<Student> students = mapper.getStudents2();
        students.forEach(System.out::println);
    }

结果如下:
在这里插入图片描述

1.7 多对一小结

  • 按照查询进行嵌套处理就像SQL中的子查询。
  • 按照结果进行嵌套处理就像SQL中的联表查询。

2 . Mybatis一对多

  • 一个老师拥有多个学生
  • 如果对于老师这边,就是一个一对多的现象,即从一个老师下面拥有一群学生(集合)!

2.1 实体类编写

  1. Student
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Student {
    private int id;
    private String name;
    private int tid;
}
  1. Teacher
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Teacher {
    private int id;
    private String name;
    private List<Student> students;
}

2.2 按结果嵌套查询

  1. TeacherMapper接口编写方法
public interface TeacherMapper {
//    获取指定老师,及老师下所有学生
    public Teacher getTeacher(@Param("id") int id);
}
  1. 编写接口对应的mapper.xml文件
<!--    思路
        1. 从学生表和老师表中查出学生id,学生姓名,老师姓名
        2. 从查询出来的数据做结果集映射
            集合使用collection
            1. JavaType和ofType都是用来指定对象类型的
            2. JavaType是用来指定pojo中属性的类型
            3. ofType指定的是映射到List集合中的pojo类型-->

    <select id="getTeacher" resultMap="TeacherStudent">
        select s.id sid, s.name sname, t.id tid, t.name tname
        from student s,
             teacher t
        where s.tid = t.id;
    </select>
    <resultMap id="TeacherStudent" type="teacher">
        <result property="id" column="tid"/>
        <result property="name" column="tname"/>
        <collection property="students" ofType="student" javaType="List">
            <result property="id" column="sid"/>
            <result property="name" column="sname"/>
            <result property="tid" column="tid"/>
        </collection>
    </resultMap>

在这里插入图片描述

2.3 按查询嵌套查询

  1. TeacherMapper接口方法
    public Teacher getTeacher2(@Param("id") int id);

  1. 编写接口对应的Mapper.xml文件
    <select id="getTeacher2" resultMap="TeacherStudent2">
        select *
        from mybatis.teacher
        where id = #{id};
    </select>
    <resultMap id="TeacherStudent2" type="teacher">
        <result property="id" column="id"/>
        <result property="name" column="name"/>
        <collection property="students" ofType="student" javaType="List" column="{tid=id}" select="getStudentByTeacherID"/>
    </resultMap>
    <select id="getStudentByTeacherID" resultType="student">
        select *
        from mybatis.student
        where tid = #{tid};
    </select>
  1. 测试
    @Test
    public void getTeacher2Test(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);
        Teacher teacher = mapper.getTeacher2(1);
        System.out.println(teacher);
    }

结果如下:
在这里插入图片描述

3 . 多对一、一对多总结

  • 关联-association
  • 集合-collection
  • association是用于一对一和多对一,而collection是用于一对多的关系。
  • JavaType和ofType都是用来指定对象类型的
    • JavaType是用来指定pojo中属性的类型。
    • ofType指定的是映射到list集合属性中pojo的类型。
  • 注意
    • 保证SQL的可读性,尽量通俗易懂。
    • 根据实际要求,尽量编写性能更高的SQL语句。
    • 注意属性名和字段不一致的问题。
    • 注意一对多和多对一 中:字段和属性对应的问题。
    • 尽量使用Log4j,通过日志来查看自己的错误。
一篇文章足够你学习Bluez,提供史上最全的Bluez教程,让你告别Bluez从入门到放弃 Bluez是真的难,说“入门到放弃”真的毫不夸张,Bluez的学习曲线陡峭,要求对Linux 系统/驱动概念、D-Bus 通信和蓝牙协议都有要求,加上网络上其实没有一个完整的介绍Bluez系列的文档,所以不管是蓝牙初学者还是蓝牙从业人员,都有不小的难度。 阅读详情

相关推荐

BALM2深度解析 | 港大MARS实验室如何用点簇革新激光BA?

本文深度解析了港大MARS实验室提出的BALM2方案如何通过点簇技术革新激光BA(Bundle Adjustment)处理。BALM2将点云数据聚合为点簇,显著提升计算效率,实测显示其计算耗时仅为传统方法的1/20。文章详细介绍了点簇的核心原理、二阶优化方法及与传统方法的性能对比,展示了其在激光SLAM领域的突破性应用。

weixin_29212867的博客 151

mybatis多对一

1、什么是多对一 顾名思义,多对一即多个对象对应一个对象,这里我们用多个学生对应一个老师来举例 2、实际操作 2.1、创建学生表 student,和老师表 teacher 学生表 CREATE TABLE `student` ( `id` INT(10) NOT NULL, `name` VARCHAR(30) DEFAULT NULL, `tid` INT(10) DEFAULT NULL, PRIMARY KEY (`id`), KEY `fktid` (`tid`), CONS

qq_43110032的博客 2022

SIwave:在 SIwave 中释放计算频率扫描的强大功能

AEDT 的电路工具允许注入正确的电压和电流。要使用电路工具,SIwave 必须首先使用 PI 求解器求解结构的 S 参数。

jkh920184196的博客 1471

Mybatis——多对一的处理

Mybatis——多对一的处理的两种方式一、用到的数据库表二、多对一的处理的两种方式1.按照查询进行嵌套处理2.按照结果进行嵌套处理源码 一、用到的数据库表 student表 tid为外键关联teacher表的主键id teacher表 二、多对一的处理的两种方式 其中student实体类需要声明teacher对象 1.按照查询进行嵌套处理 <!--思路:1。查询所有的学生信息 2.根据学生的tid寻找对应的老师--> <select id

Cooper的博客 297

UCIe物理层 —— 逻辑协议 (2)

本章开始主要介绍UCIe协议第四章,物理层逻辑定义和规范。如其他的通信协议一样,接口的物理层包含两个部分,逻辑子层和电气子层。其中逻辑层主要负责:1.定义接口信号和时序2. 定义发送端如何将上层数据分发到各个物理通道以及接收端如何把从各个通道收到的数据恢复成byte stream(Flit)。3. Broken Lane的repair和remap。4. 链路初始化,训练(training)和电源状态管理/切换。5. 扰码Scrambling和training sequence的产生。

m0_47581558的博客 1476

RTX 5090配Ubuntu 24.04踩坑记:手把手搞定OpenVLA-OFT环境(附版本避坑清单)

本文详细记录了在RTX 5090显卡和Ubuntu 24.04系统上部署OpenVLA-OFT环境的完整过程,包括驱动安装、CUDA配置、PyTorch版本选择等关键步骤。提供了经过验证的版本组合清单和常见错误解决方案,帮助开发者高效搭建AI开发环境。

weixin_30342209的博客 465

快速了解MyBatis---映射关系多对一

项目中多对1 的关系是一个基本的映射关系, 多对1, 也可以理解成是1 对多.User — Pet: 一个用户可以养多只宠物Dep —Emp : 一个部门可以有多个员工。

m0_73557631的博客 1841

期货缠论实战:文华财经笔中枢指标公式解析与博易大师应用指南

本文深入解析期货缠论实战中的文华财经笔中枢指标公式及其在博易大师平台的应用技巧。详细介绍了笔中枢指标的核心逻辑、公式拆解、参数设置及多周期联合作战策略,帮助交易者提升市场分析能力与交易胜率。特别适合期货交易者学习缠论指标的实际应用。

weixin_42522552的博客 356

mybatis高级映射之多对一

ClazzMapper 因为步骤二是根据步骤一查出来的cid来获取clazz信息,所以本质是查询clazz信息的,所以要在clazzMapper中定义方法。**注意:**如果在项目中遇到某一条sql,业务需求,不让他使用延迟加载,那就使用。主表,副标怎么区分,谁在前谁就是主表,多对一,多的这个表就是主表。显而易见,开启延迟加载后,用到的时候才进行加载,不用的时候不加载。我们在上面的分布查询代码的基础上,我们只需要获取学生的姓名,例如:多个学生对应一个班级,学生表就是主表,班级表就是副表。

TCDHanyongpeng的博客 452

YOLOv11改进策略【模型轻量化】| 替换骨干网络 CVPR-2024 RepViT 轻量级的Vision Transformers架构

本文记录的是基于RepVit的YOLOv11轻量化改进方法研究。RepVit的网络结构借鉴ViT的设计理念,通过分离的token mixe和减少推理时的计算和内存成本,同时减少扩展比率并增加宽度,降低延迟,并通过来弥补参数大幅减少的问题,提高了准确性。本文在替换骨干网络中配置了原论文中的和五种模型,以满足不同的需求。

Limiiiing的博客 2972

Open3D 基于法线的双边滤波

基于法线的双边滤波是一种用于点云平滑的技术,它结合了点与其邻域点之间的几何距离和法线方向的相似性,从而在去除噪声的同时保留几何特征。这种滤波方法广泛应用于点云处理领域,尤其是在需要保留表面细节和边缘的场景中。

纵马踏花向自由 2498

Mybatis多表查询之一对多、多对一

前言 上次整理了单表的一些基本操作,现实工作可能会涉及复杂的多表查询,本文主要对Mybatis多表查询之一对多、多对一进行讲述。无论是一对多还是多对一,无非是涉及两个标签:collection和association,至于怎么去用和理解,后文会说明。每种查询都可以用两种方式去实现:按照查询嵌套处理(子查询)和按照结果嵌套处理(联表查询)。在进行操作前,需要把相关配置搞定,可以参考博主以往的博客。看之前需要对几个标签有所理解: property:对象、成员变量属性的名称 column:数据库字段名..

静水流深,沧笙踏歌 1万+

Python re库【正则表达式操作库】全面讲解及代码示例

以下是Pythonre库的全面讲解,包含主要功能、常用方法及代码示例。完整代码和注释附后。正则表达式(Regular Expression)是用于匹配、查找、替换字符串的工具,通过特定语法定义模式。?{n}[...][a-z]A|B\d[0-9]\D\s\S\w\Wre从字符串匹配模式,返回Match对象或None。在字符串中第一个匹配项,返回Match对象或None。返回所有匹配项的。返回所有匹配项的Match对象)。替换匹配项,返回新字符串。根据模式分割字符串,返回列表。通过。

记录点滴 1160

Mybatis-07-多对一和一对多处理

多对一处理 如, 多个学生,对应一个老师 多个学生关联一个老师(多对一) 一个老师有很多学生(一对多) SQL: create table `teacher`( `id` int(10) not null , `name` varchar(30) default null, primary key(`id`) )engine=innodb default charset =utf8; insert into teacher(`id`,`name`) values(1,"秦老师");

HUBA_yosa的博客 180

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

MyBatis 一对多、多对一的处理~

目录1、多对一处理1.1、打个比方1.2、实例环境搭建1.3、目标:查询所有的学生信息以及对应的老师信息方式一:查询嵌套方式二:结果嵌套2、一对多处理目标:获取指定老师下的所有学生及老师的信息方式一:结果嵌套方式二:查询嵌套3、小结4、注意点 1、多对一处理 1.1、打个比方 比如:多个学生对应一个老师 对于学生,关联,多个学生关联一个老师【多对一】 对于老师,集合,一个老师有多个学生【一对多】 1.2、实例环境搭建 搭建数据库表 CREATE TABLE `teacher` ( `i

欢迎来到 Baret-H 的博客 6468

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

深入浅出 MyBatis | Lombok、多对一处理、一对多处理

该mapper元素绑定了接口,表示该 XML 配置文件用于定义与该接口相关的 SQL 查询语句。</:定义了一个查询方法,该方法会执行相应的 SQL 查询。:指定查询结果应映射到的resultMap中,resultMap定义了 SQL 查询结果如何映射到 Java 对象。:查询学生表和老师表,返回学生的id和name,以及老师的name。s.id sid:将学生的id列映射为sid,用来与 Java 对象的属性id对应。:将学生的name列映射为sname,用来与 Java 对象的属性name。

青年有志 1120

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

MyBatis一对多,多对一,多对多

MyBatis中的一对多和对多一,多对多 主要就是resultMap中 association – 一个复杂的类型关联;许多结果将包成这种类型(一对多) collection – 复杂类型的集合(多对一) 这2个属性的使用,而一对多和多对一都是相互的,只是站的角度不同。实例: 这个实例只说这2个属性的使用方法,具体的配置和运行结果在SSM环境搭建文章中写出。 1.首先是数据库,沿用之前员

黄国攀的博客 4万+

MyBatis多对一及一对多处理

MyBatis一对多及多对一相关问题解答

weixin_54438185的博客 1625

mybatis的多对一、一对多的用法

当我需要多对一、一对多时,可以创建VO聚合对象。例如:学生类和老师类,会出现多对一、一对多的情况。此时创建一个聚合类,里面包含所需要的学生类和老师类的属性。并先查询出前面的内容,再根据前面的内容查询出后面的内容。

java领域博主 1321

Mybatis - 一对多/多对一映射

Mybatis 一对多(collection关联查询) 和 多对一 (级联,association关联查询,association分布查询)映射

weixin_46030002的博客 3521

mybatis--多对一处理/一对多处理

注:单表查询时,当执行到tid时去调用映射,映射又去子查询,所以#{}里面自动填充了cloum的值,所以#{}的值可以随便添,记住,是单表查询时。注意一对多和多对一中 属性名和字段名的问题如果问题不好排查,可以使用日志,建议使用log4j。ofType 用来指定映射到List或者集合中的实体类,反省中的约束类型。5.在核心配置文件中绑定注册我们的Mapper映射文件。对于老师而言,集合,一个老师有多个学生【一对多】:多个学生,关联一个老师[多对一]3.编写Mybatis工具包。环境搭建: 与上文一致。

m0_73856804的博客 634

【MyBatis】多对一与一对多处理

1.搭建测试环境 背景: 多个学生,对应一个老师 对于学生这边而言, 关联 … 多个学生,关联一个老师 【多对一】 对于老师而言, 集合 , 一个老师,有很多学生 【一对多】 创建学生和老师的SQL语句 CREATE TABLE `teacher` ( `id` INT(10) NOT NULL, `name` VARCHAR(30) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=INNODB DEFAULT CHARSET=utf8 IN

alovelypeach的博客 457

Mybatis的多对一,一对多处理

多对一: 多个学生对应一个老师 对于学生而言,关联多个学生,关联一个老师【多对一】 对于老师而言,集合一个老师有很多学生【一对多】 SQL: CREATE TABLE `teacher` ( `id` INT(10) NOT NULL, `name` VARCHAR(30) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=INNODB DEFAULT CHARSET=utf8 INSERT INTO teacher(`id`, `name`) VAL

Solitude_w的博客 212

Mybatis05-一对多和多对一处理

d=4, name=‘小李’, tid=1}, Student{id=5, name=‘小王’, tid=1}]}association是用于一对一和多对一,而collection是用于一对多的关系。association是用于一对一和多对一,而collection是用于一对多的关系。4、注意一对多和多对一 中:字段和属性对应的问题。4、注意一对多和多对一 中:字段和属性对应的问题。关联:association【多对一】关联:association【多对一】TeacherMapper接口`

xzh202206的博客 1342

mybatis一对多和多对一的联系和区别(例子详解)

使用mybatis操作数据库也有好一阵时间了,本篇记录并解释一下使用mybatis进行一对多,多对一查询显示数据。(一对一此处不讲解,会了一对多查询,一对一也就会了) 本例用员工表和部门表作为讲解,首先看员工表和部门表的表结构: 解释:部门表就包含两个字段,员工表的部门编号作为外键指向部门表的部门号(员工表是子表(这里可以理解为主表),部门表是父表(这里可以理解为从表)) (一般存在关系的表,在...

C_bianchengxiaobai的博客 4908

MyBatis多表配置一对多和多对一

1. property和column的值相同时,@Result可以省略。@Result:JavaBean的一个属性 和 表的一个列的对应关系。@Results:用于配置一个JavaBean与一个表的对应关系。@Many(select=“另一个mapper对应的方法”)mapper对应的方法要求:包名.类名.方法名。property:JavaBean的属性名。修改User对象,添加对应的订单属性。many:用于配置一对多关系的。驼峰映射:JavaBean的。column:表中列的名。

qiuyeyyy的博客 1809
上一篇: Mybatis_06 注解开发
下一篇: Mybatis_08 动态SQL
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值