目录

  • `MyBatis` 一对多和多对一处理
    • 数据准备
  • `MyBatis` 多对一处理
    • 实体类
    • `Service` 层接口
    • `mapper.xml` 文件
    • 测试类
    • 测试结果
  • `MyBatis` 一对多处理
    • 实体类
    • `Service` 层接口
    • `mapper.xml` 文件
    • 测试类
    • 测试结果

MyBatis 一对多和多对一处理

这里我们以老师和学生为例,一个老师对应多个学生,这是一对多;反过来,多个学生对应一个老师,这是多对一

MyBatis 参考文档:https://mybatis.org/mybatis-3/zh/getting-started.html 可以查看详细的 XML 映射器

数据准备

CREATE TABLE `teacher` (`id` INT(10) NOT NULL,`name` VARCHAR(30) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8INSERT INTO teacher(`id`, `name`) VALUES (1, '秦老师');
INSERT INTO teacher(`id`, `name`) VALUES (2, '张老师');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=utf8INSERT 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', '小王', '2');
INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('6', '小刚', '2');

MyBatis 多对一处理

实体类

@Data
public class Student implements Serializable {private Integer id;private String name;private Integer tid;// 数据库不存在的字段,与下面的 association 标签形成映射private Teacher teacher;
}@Data
public class Teacher implements Serializable {private Integer id;private String name;
}

Service 层接口

List<Student> getStudents(Integer tid);

mapper.xml 文件

<!--多对一处理示例,通过学生查找老师-->
<select id="getStudents" parameterType="java.lang.Integer" resultMap="selectTeacher">SELECTs.id,s.`name`,t.`name`FROMstudent AS sINNER JOIN teacher AS t ON s.tid = t.idWHEREs.tid = #{tid}
</select><resultMap id="selectTeacher" type="com.atguigu.pojo.Student"><!--id:查询列中的唯一标识--><id column="id" property="id"></id><!--<result property="映射到实体类的属性" column="表字段" jdbcType="字段类型"></result>--><result column="name" property="name"></result><!--关联对象 property 关联对象在 Student 实体类中的属性--><association property="teacher" javaType="com.atguigu.pojo.Teacher"><result column="name" property="name"></result></association>
</resultMap>
  • column:数据库表对应的字段;如果有别名,就是数据库查询出来的字段的别名
  • property:与实体类对应的属性
  • jdbcType:可以不用写会自动映射

测试类

@SpringBootTest
@RunWith(SpringRunner.class)
public class AppTest {@Autowiredprivate StudentServce studentServce;@Testpublic void shouldAnswerWithTrue() {List<Student> students = studentServce.getStudents(1);System.out.println(students);}
}

测试结果

MyBatis 一对多处理

实体类

@Data
public class Student implements Serializable {private Integer id;private String name;private Integer tid;
}@Data
public class Teacher implements Serializable {private Integer id;private String name;// 数据库不存在的字段,与下面的 collection 标签形成映射private List<Student> students;
}

Service 层接口

List<Teacher> getTeacher(Integer id);

mapper.xml 文件

<!--一对多处理,通过教师查询学生-->
<select id="getTeacher" parameterType="java.lang.Integer" resultMap="selectTeacher">SELECTt.`name`AS t_name,s.id,s.`name`AS s_nameFROMteacher AS tINNER JOIN student AS s ON t.id = s.tidWHEREt.id = #{id}
</select><resultMap id="selectTeacher" type="com.atguigu.pojo.Teacher"><id column="id" property="id"></id><result column="t_name" property="name"></result><collection property="students" ofType="com.atguigu.pojo.Student"><id column="id" property="id"></id><result column="s_name" property="name"></result></collection>
</resultMap>
  • column:数据库表对应的字段;如果有别名,就是数据库查询出来的字段的别名
  • property:与实体类对应的属性
  • jdbcType:可以不用写会自动映射
  • ofType:映射的属性(集合)中实体对象的类型

测试类

@SpringBootTest
@RunWith(SpringRunner.class)
public class AppTest {@Autowiredprivate TeacherService teacherService;@Testpublic void findByTeacherToStudent() {List<Teacher> teachers = teacherService.getTeacher(1);System.out.println(teachers);}
}

测试结果

MyBatis中一对多和多对一处理相关推荐

  1. Mybatis第三天动态Sql语句、XML中一对多、多对一、多对多该怎么写

    Mybatis第三天 Mybatis中使用unpooled配置连接池原理分析 Mybatis中使用pooled配置连接的原理分析 Mybatis中的事务原理和自动提交设置 Mybatis中的动态sql ...

  2. Mybatis【一对多、多对一、多对多】知识要点

    Mybatis[多表连接] 我们在学习Hibernate的时候,如果表涉及到两张的话,那么我们是在映射文件中使用<set>..<many-to-one>等标签将其的映射属性关联 ...

  3. Mybatis入门---一对多、多对多

    前几天自己配置了Mybatis的高级查询:一对多和多对多,现在记录一下,方便以后用到的时候再回顾,下面是具体的操作步骤 一.首先就是配置Mybatis的xml文件及mapper的xml文件,在这里就不 ...

  4. mybatis的一对多和多对多查询

    一对多和多对多的关系 我是以你平时买东西为例子的,一个用户对应多个订单,一个订单对应多个订单明细,一个订单明细对应一个商品,根据这些关系来进行实例演示. 实例演示 一对多(一个订单对应多个订单明细)  ...

  5. mysql表中的多对多关系表_「一对多」关系型数据库中一对多,多对一,多对多关系(详细) - seo实验室...

    一对多 在关系型数据库中,通过外键将表跟表之间联系在了一起. 一个班级有很多学生,外键维护在学生的一方,也就是多的一方.(在做页面设计的时候,需要把两个表连接到一块查询信息) 建立一个student和 ...

  6. 事件Event:带你体验鸿蒙轻内核中一对多、多对多任务同步

    摘要:本文通过分析鸿蒙轻内核事件模块的源码,深入掌握事件的使用. 本文分享自华为云社区<鸿蒙轻内核M核源码分析系列十二 事件Event>,原文作者:zhushy . 事件(Event)是一 ...

  7. mybatis中一对多的写法,注解SQL, and XML

    mybatis中注解对collection集成不是太好. 应用场景:当需要从表中获取一对多数据时(入redis用),我们用注解sql写的时候,长这样: //以userId为key,对应的多条记录为va ...

  8. Mybatis的一对多、多对一、多对多案例

    一.一对多 1.首先创建数据库和表.两张表的id字段是自动递增的. 给category表录入两条数据,可自行添加记录. INSERT INTO `category` VALUES (1, '我是分类1 ...

  9. ABP框架中一对多,多对多关系的处理以及功能界面的处理(2)

    不管上面的树形列表,还是很后面的复选框组,都是先请求关联主表的数据,然后再请求对应角色或者商品类型下的关系数据,绑定到界面上. 如对于上面的树形列表,通过设置树列表的数据,以及选中的记录就可以实现对应 ...

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

    使用mybatis操作数据库也有好一阵时间了,本篇记录并解释一下使用mybatis进行一对多,多对一查询显示数据.(一对一此处不讲解,会了一对多查询,一对一也就会了) 本例用员工表和部门表作为讲解,首 ...

最新文章

  1. C语言常用的字符串函数
  2. zabbix3.2.4监控MySQL5.7.16状态
  3. 【UOJ188】 Sanrd【类min_25筛】
  4. vue-beauty 的v-data-table数据单元不换行
  5. hadoop 多节点集群_设置Apache Hadoop多节点集群
  6. 初探EntityFramework——空EF设计器模型
  7. 学习日报 day03 实体与标识符 变量与数据类型
  8. Java 并发(Future 模式)
  9. 停止、删除所有的docker容器和镜像
  10. HDU5620 KK's Steel(C语言版)【废除!!!】
  11. 百度大脑全面解析如何通过NLP、CV和ASR等技术将企业服务智能化
  12. 学习——java内存模型
  13. bootchart.jar 编译过程
  14. 【精读】Transformer模型深度解读
  15. Python爬虫,批量下载小说网站上的小说!
  16. android 7 语音助手,语音助手横评:iPhone 大战 Android 旗舰,谁更好用?
  17. 投资 - 出口 - 消费
  18. Ubuntu18+ 使用redshift调色温 夜间闪烁
  19. 一步步推导由欧拉角到旋转矩阵的计算过程
  20. ES6-Promise实时获取地址和天气问题

热门文章

  1. 实战 Kaggle 比赛:狗的品种识别(ImageNet Dogs) 动手学深度学习v2 pytorch
  2. 算法:同构字符串205. Isomorphic Strings
  3. 如何在Swift中掌握协议
  4. java开发常用的linux命令,Java开发中最常用的Linux命令整理
  5. ELMo ,LM:一串词序列的概率分布probability distribution over sequences of words
  6. C++ OS 网络 数据库 (面试)
  7. NLP Prompt范式,两种主要类型:填充文本字符串空白的完形填空(Cloze)prompt,和用于延续字符串前缀的前缀 (Prefix) prompt。
  8. matlab仿真之大尺度衰落因子的产生
  9. 输出结果 配置_用单端仪表放大器实现全差分输出
  10. SpringBoot日常游玩---当你需要在一个静态方法中使用一个带有其他@Autowried的实现类的时候怎么办