(视频教程参考:遇见狂神说(B站UP主))
多对一的两种处理方式
1.查询的嵌套处理:子查询
介绍
条件:多个学生对应一个老师,学生表中设置外键存老师ID
数据库表
CREATE DATABASE `mybatis`;
USE `mybatis`;
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(20) NOT NULL,
`name` varchar(30) DEFAULT NULL,
`pwd` varchar(30) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into `user`(`id`,`name`,`pwd`) values (1,'狂神','123456'),(2,'张三','abcdef'),(3,'李四','987654');
实体类
package com.atcx.pojo;
import lombok.Data;
/**
* Copyright (C), 2017-2022, MIDOU
* ClassName: Student
* Author: pangshu
* Date: 2022/4/30 10:34
* Version: 1.0
* Description:
*/
@Data
public class Student {
private int id;
private String name;
private Teacher teacher;
}
package com.atcx.pojo;
import lombok.Data;
/**
* Copyright (C), 2017-2022, MIDOU
* ClassName: Teacher
* Author: pangshu
* Date: 2022/4/30 10:34
* Version: 1.0
* Description:老师
*/
@Data
public class Teacher {
private int id;
private String name;
}
处理方式:这种处理方式需要两条查询语句完成,第一条sql语句先查询所有学生信息,然后根据关联的老师ID查询老师信息,然后进行类型转化。
1.给StudentMapper接口增加方法
public List<Student> getStudentList();
2.编写对应的Mapper文件
<!-- 多对一第一种方式:子查询-->
<!-- 第一步:直接查询所有学生信息-->
<select id="getStudentList" resultMap="StudentTeacher">
select * from student
</select>
<!--
第二步:直接查询学生信息,实体类和数据库映射有问题,不对应,所以采用resultMap
所以在设置结果集的映射的时候,使用association进行处理,将teacher属性作为一个类去对待,
所以在做映射的时候,它从数据库里边查到的tid这个字段的值,tid不能直接赋值给teacher,
这里就需要多执行一步操作,就是根据tid的值,查询出老师的信息,赋值给teacher。
所以它每一次为student做结果映射的时候,就会顺便查老师的信息,并且赋值。
-->
<resultMap id="StudentTeacher" type="student">
<association property="teacher" column="tid" javaType="teacher" select="getTeacherById"> </association>
</resultMap>
<!-- 所以第三步:因为学生表中的tid就是通过外键引用的老师表中的id,
所以这里直接就拿tid当老师表的id使用,所以只需要写一条查询语句,通过老师id查询老师信息就完成了
-->
<select id="getTeacherById" resultType="teacher">
select * from teacher where id = #{tid}
</select>
三部曲:
第一步:直接查询所有学生信息。
第二步:直接查询学生信息,实体类和数据库映射有问题,不对应,所以采用resultMap
所以在设置结果集的映射的时候,使用association进行处理,将teacher属性作为一个类去对待,
所以在做映射的时候,它从数据库里边查到的tid这个字段的值,tid不能直接赋值给teacher,
这里就需要多执行一步操作,就是根据tid的值,查询出老师的信息,赋值给teacher。
所以它每一次为student做结果映射的时候,就会顺便查老师的信息,并且赋值。
所以第三步:因为学生表中的tid就是通过外键引用的老师表中的id,
所以这里直接就拿tid当老师表的id使用,所以只需要写一条查询语句,通过老师id查询老师信息就完成了
2.查询结果嵌套处理:多表联查
1、接口方法编写
public List<Student> getAllStudent();
2.编写对应的mapper文件
<!--多表联查-->
<!-- 解析:多表联查分两步走。
第一步:编写多表联查语句,拿到想要的结果。
-->
<select id="getAllStudent" resultMap="TeacherStudent">
select s.id sid,s.name sname,t.name tname
from student s,teacher t
where s.tid = t.id
</select>
<!-- 第二步:对结果进行映射设置,将需要的结果封装到实体类中,方便使用。-->
<!-- 这里采用的是association标签中嵌套result标签-->
<resultMap id="TeacherStudent" type="student">
<id property="id" column="sid"></id>
<result property="name" column="sname"></result>
<association property="teacher" javaType="teacher">
<result property="name" column="tname"></result>
</association>
</resultMap>
两部曲:
解析:多表联查分两步走。
第一步:编写多表联查语句,拿到想要的结果。
第二步:对结果进行映射设置,将需要的结果封装到实体类中,方便使用