MyBatis中一对多和多对一处理
目录
- `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中一对多和多对一处理相关推荐
- Mybatis第三天动态Sql语句、XML中一对多、多对一、多对多该怎么写
Mybatis第三天 Mybatis中使用unpooled配置连接池原理分析 Mybatis中使用pooled配置连接的原理分析 Mybatis中的事务原理和自动提交设置 Mybatis中的动态sql ...
- Mybatis【一对多、多对一、多对多】知识要点
Mybatis[多表连接] 我们在学习Hibernate的时候,如果表涉及到两张的话,那么我们是在映射文件中使用<set>..<many-to-one>等标签将其的映射属性关联 ...
- Mybatis入门---一对多、多对多
前几天自己配置了Mybatis的高级查询:一对多和多对多,现在记录一下,方便以后用到的时候再回顾,下面是具体的操作步骤 一.首先就是配置Mybatis的xml文件及mapper的xml文件,在这里就不 ...
- mybatis的一对多和多对多查询
一对多和多对多的关系 我是以你平时买东西为例子的,一个用户对应多个订单,一个订单对应多个订单明细,一个订单明细对应一个商品,根据这些关系来进行实例演示. 实例演示 一对多(一个订单对应多个订单明细) ...
- mysql表中的多对多关系表_「一对多」关系型数据库中一对多,多对一,多对多关系(详细) - seo实验室...
一对多 在关系型数据库中,通过外键将表跟表之间联系在了一起. 一个班级有很多学生,外键维护在学生的一方,也就是多的一方.(在做页面设计的时候,需要把两个表连接到一块查询信息) 建立一个student和 ...
- 事件Event:带你体验鸿蒙轻内核中一对多、多对多任务同步
摘要:本文通过分析鸿蒙轻内核事件模块的源码,深入掌握事件的使用. 本文分享自华为云社区<鸿蒙轻内核M核源码分析系列十二 事件Event>,原文作者:zhushy . 事件(Event)是一 ...
- mybatis中一对多的写法,注解SQL, and XML
mybatis中注解对collection集成不是太好. 应用场景:当需要从表中获取一对多数据时(入redis用),我们用注解sql写的时候,长这样: //以userId为key,对应的多条记录为va ...
- Mybatis的一对多、多对一、多对多案例
一.一对多 1.首先创建数据库和表.两张表的id字段是自动递增的. 给category表录入两条数据,可自行添加记录. INSERT INTO `category` VALUES (1, '我是分类1 ...
- ABP框架中一对多,多对多关系的处理以及功能界面的处理(2)
不管上面的树形列表,还是很后面的复选框组,都是先请求关联主表的数据,然后再请求对应角色或者商品类型下的关系数据,绑定到界面上. 如对于上面的树形列表,通过设置树列表的数据,以及选中的记录就可以实现对应 ...
- mybatis一对多和多对一的联系和区别(例子详解)
使用mybatis操作数据库也有好一阵时间了,本篇记录并解释一下使用mybatis进行一对多,多对一查询显示数据.(一对一此处不讲解,会了一对多查询,一对一也就会了) 本例用员工表和部门表作为讲解,首 ...
最新文章
- C语言常用的字符串函数
- zabbix3.2.4监控MySQL5.7.16状态
- 【UOJ188】 Sanrd【类min_25筛】
- vue-beauty 的v-data-table数据单元不换行
- hadoop 多节点集群_设置Apache Hadoop多节点集群
- 初探EntityFramework——空EF设计器模型
- 学习日报 day03 实体与标识符 变量与数据类型
- Java 并发(Future 模式)
- 停止、删除所有的docker容器和镜像
- HDU5620 KK's Steel(C语言版)【废除!!!】
- 百度大脑全面解析如何通过NLP、CV和ASR等技术将企业服务智能化
- 学习——java内存模型
- bootchart.jar 编译过程
- 【精读】Transformer模型深度解读
- Python爬虫,批量下载小说网站上的小说!
- android 7 语音助手,语音助手横评:iPhone 大战 Android 旗舰,谁更好用?
- 投资 - 出口 - 消费
- Ubuntu18+ 使用redshift调色温 夜间闪烁
- 一步步推导由欧拉角到旋转矩阵的计算过程
- ES6-Promise实时获取地址和天气问题
热门文章
- 实战 Kaggle 比赛:狗的品种识别(ImageNet Dogs) 动手学深度学习v2 pytorch
- 算法:同构字符串205. Isomorphic Strings
- 如何在Swift中掌握协议
- java开发常用的linux命令,Java开发中最常用的Linux命令整理
- ELMo ,LM:一串词序列的概率分布probability distribution over sequences of words
- C++ OS 网络 数据库 (面试)
- NLP Prompt范式,两种主要类型:填充文本字符串空白的完形填空(Cloze)prompt,和用于延续字符串前缀的前缀 (Prefix) prompt。
- matlab仿真之大尺度衰落因子的产生
- 输出结果 配置_用单端仪表放大器实现全差分输出
- SpringBoot日常游玩---当你需要在一个静态方法中使用一个带有其他@Autowried的实现类的时候怎么办