mybatis一对多和多对一的核心思想

本文详细介绍了MyBatis中处理多对一关系的两种方式:查询的嵌套处理(子查询)和查询结果嵌套处理(多表联查)。对于子查询方式,通过两条SQL查询学生及关联的老师信息,并使用resultMap的association进行映射。而对于多表联查,通过一条SQL获取数据,再用resultMap进行结果封装。这两种方法都是为了将数据库中的多对一关系映射到Java对象上,便于业务处理。
摘要由CSDN通过智能技术生成

(视频教程参考:遇见狂神说(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>

两部曲:

 解析:多表联查分两步走。
        第一步:编写多表联查语句,拿到想要的结果。

        第二步:对结果进行映射设置,将需要的结果封装到实体类中,方便使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值