Mybatis关联查询之一对多XML配置详解

最初看的这篇教程
https://blog.csdn.net/qq_33561055/article/details/78861131

但是有些地方没有解释详细,自己研究了一会,决定将之详细化

  • 首先是有两张表,头行结构。相当于是一张老师表一张学生表。
    学生表
    老师表
    逻辑结构就是一个老师有多个学生,我们在查询的时候想要的结果是查出所有的老师的数据以及每一个老师所对应的学生的数据。

  • 创建实体bean
    头表和行表都需要创建相应的实体类。在头表中需要新增一个字段(表中不存在的),用来存放行表中查出的对应的数据。

@VersionAudit
@ModifyAudit
@Table(name = "teacher")
public class TeacherDTO {

    @Id
    @GeneratedValue
    @Column(name = "id")
    private Integer id;

    @Column(name = "name")
    private String name;

    @Column(name = "class_name")
    private String className;

    @Transient
    private List<StudentDTO> students;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getClassName() {
        return className;
    }

    public void setClassName(String className) {
        this.className = className;
    }

    public List<StudentDTO> getStudents() {
        return students;
    }

    public void setStudents(List<StudentDTO> students) {
        this.students = students;
    }
}

我这里用students来存放 行表 中查询的出的数据。@Transient这个注解表示该实体中定义数据库中没有的字段。

  • 配置Mapper.xml文件
    在查询了网上资料以及翻阅相关书籍后,总结出mybatis中一对多的方式,其实这个方法的效率是比较高的,所以优先用这个方法,前文中的链接中也有提到这种方法,就是链接中的第二种方法。
    代码的详解放在代码的注释中
<?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="test.mapper.TeacherMapper">

    <!-- type 头表的返回格式,也就是头表的实体类-->
    <resultMap id="teacherMap" type="test.domain.TeacherDTO">
        <id property="id" column="id"/>
        <result column="name" property="name"/>
        <result column="class_name" property="className"/>
        <!-- ofType 行表的返回格式-->
        <!-- select 行表的sql查询语句的id-->
        <!--column 头表与行表的连接字段,注意这里用的是下划线,下面用的是驼峰-->
        <collection property="students" ofType="test.domain.StudentDTO" select="findStudents" column="id">
        </collection>
    </resultMap>

    <!--头表查询语句-->
    <select id="findTeacherAndStudent" resultMap="teacherMap">

        SELECT
            id,
            NAME,
            class_name
        FROM
            `teacher`
    </select>

    <!--行表查询语句-->
    <select id="findStudents" resultType="test.domain.StudentDTO">

        SELECT
            id,
            teacher_id,
            name,
            class_name
        FROM
            `student`
        WHERE
            1=1
--         这里递进来的的参数是驼峰格式
        AND id = #{id}

    </select>

</mapper>
  • 这是mybatis的拼接方式,有时候其实也可以用java的拼接方式,独立出两个查询接口,然后在java中拼接

这是service实现类中的拼接方式

public List<TeacherDTO> findTeacherAndStudentByJava(String id) {
        List<TeacherDTO> result = teacherMapper.findTeacher(id);
        //遍历头表中查询到的每一条数据
        for (TeacherDTO teacherDTO : result) {
            //将行表查询到的数据放在头表中的students字段中
            teacherDTO.setStudents(teacherMapper.findStudents(teacherDTO.getId()));
        }
        return result;
    }
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值