Mybatis实现一对多映射处理

 更新时间:2023年08月03日 11:47:45   作者:_GGBond_  
MyBatis是一种流行的Java持久化框架,这篇文章主要为大家介绍了Mybatis如何实现一对多映射处理,文中的示例代码讲解详细,需要的可以参考下

一、概述

一对多关系表示一个实体对象(一)可以拥有多个关联对象(多)。

例如,一个用户可以有多个订单,或者一个部门可以有多个员工。

在数据库中,一对多关系通常通过外键来实现。

二、创建数据模型

定义实体类:定义主表实体类和从表实体类,主表实体类 中包含 从表实体类 的List集合属性。

现在我们以此来创建面向对象语言的对象数据模型:

Dept.java

public class Dept {
    private Integer did;
    private String deptName;
    private List<Emp> emps;//用于表示数据库一对多的关系
    // 省略构造函数和getter/setter方法
}

Emp.java

public class Emp {
    private Integer eid;
    private String empName;
    private Integer age;
    private String sex;
    private String email;
    // 省略构造函数和getter/setter方法
}

三、问题

假设我们现在又两张表,一张员工表,一张部门表,现在我们要获取部门以及该部门中所有的员工信息

四、解决方案

1、方案一:collection(嵌套结果)

嵌套结果:使用嵌套结果的方式,可以在查询主实体对象的同时,通过嵌套的方式将关联实体对象的属性嵌套到主实体对象的属性中。这种方式的实现需要在Mapper.xml文件中定义一个SQL语句,使用嵌套的方式将关联实体对象的属性映射到主实体对象的属性中。在定义映射关系时,需要使用resultMap标签来定义主实体对象和关联实体对象的映射关系,使用collection标签来嵌套关联实体对象的属性。

DeptMapper.java

 /**
     * @description:获取部门以及部门中所有的员工信息
     * @author: Hey
     * @date: 2022/7/4 10:46
     * @param: [did]
     * @return: com.ir.mybatis.pojo.Dept
     **/
    Dept getDeptAndEmp(@Param("did") Integer did);

DeptMapper.xml

<resultMap id="deptAndEmpResultMap" type="Dept">
        <id property="did" column="did"></id>
        <result property="deptName" column="dept_name"></result>
        <!--
            collection:处理一对多的映射关系
            ofType:表示该属性所对应的集合中存储数据的类型
        -->
        <collection property="emps" ofType="Emp">
            <id property="eid" column="eid"></id>
            <result property="empName" column="emp_name"></result>
            <result property="age" column="age"></result>
            <result property="sex" column="sex"></result>
            <result property="email" column="email"></result>
        </collection>
    </resultMap>
    <!--Dept getDeptAndEmp(@Param("did") Integer did);-->
    <select id="getDeptAndEmp" resultMap="deptAndEmpResultMap">
        select * from t_dept left join t_emp on t_dept.did = t_emp.did where t_dept.did = #{did}
    </select>

ResultTest.java

 /**
     * @description:获取部门以及部门中所有的员工信息
     * @author: Hey
     * @date: 2022/7/4 10:54
     * @param: []
     * @return: void
     **/
    @Test
    public void testGetDeptAndEmp(){
        SqlSession sqlSession = SqlSessionUtils.getSqlSession();
        DeptMapper mapper = sqlSession.getMapper(DeptMapper.class);
        Dept dept = mapper.getDeptAndEmp(1);
        System.out.println(dept);
        /**
         * Dept{
         * did=1, deptName='A',
         * emps=[
         * Emp{eid=1, empName='喜羊羊', age=34, sex='男', email='123@qq.com'},
         * Emp{eid=4, empName='沸羊羊', age=23, sex='男', email='123@qq.com'}
         * ]
         * }
         */
    }

2、方案二:分步查询(嵌套查询)

嵌套查询:使用嵌套查询的方式,可以在查询主实体对象的同时,通过查询关联实体对象的方式获取相关联的多个实体对象。这种方式的实现需要在Mapper.xml文件中定义两个独立的SQL语句,一个用于查询主实体对象,另一个用于查询关联实体对象。在查询主实体对象时,通过使用select标签的子标签来执行关联实体对象的查询,并将查询结果映射到主实体对象的属性中。

DeptMapper

 /**
     * @description:通过分步查询查询部门以及部门中所有的员工信息
     *              分步查询第一步:查询部门信息
     * @author: Hey
     * @date: 2022/7/4 12:31
     * @param: [did]
     * @return: com.ir.mybatis.pojo.Dept
     **/
    Dept getDeptAndEmpByStepOne(@Param("did") Integer did);

DeptMapper.xml

 <resultMap id="deptAndEmpByStepResultMap" type="Dept">
        <id property="did" column="did"></id>
        <result property="deptName" column="dept_name"></result>
        <collection property="emps"
                    select="com.ir.mybatis.mapper.EmpMapper.getDeptAndEmpByStepTwo"
                    column="did" fetchType="eager">
        </collection>
    </resultMap>
    <select id="getDeptAndEmpByStepOne" resultType="deptAndEmpByStepResultMap">
        select * from t_dept where did = #{did}
    </select>

EmpMapper

/**
     * @description:通过分步查询查询部门以及部门中所有的员工信息
     *              分步查询第二步:根据did查询员工信息
     * @author: Hey
     * @date: 2022/7/4 12:36
     * @param: [did]
     * @return: java.util.List<com.ir.mybatis.pojo.Emp>
     **/
    List<Emp> getDeptAndEmpByStepTwo(@Param("did") Integer did);

EmpMapper.xml

<select id="getDeptAndEmpByStepTwo"  resultType="Emp">
      select * from t_emp where did = #{did}
    </select>

ResultTest

/**
     * @description:通过分步查询查询部门以及部门中所有的员工信息
     * @author: Hey
     * @date: 2022/7/4 12:40
     * @param: []
     * @return: void
     **/
    @Test
    public void testGetDeptAndEmpByStep(){
        SqlSession sqlSession = SqlSessionUtils.getSqlSession();
        DeptMapper mapper = sqlSession.getMapper(DeptMapper.class);
        Dept dept = mapper.getDeptAndEmpByStepOne(1);
        System.out.println(dept.getDeptName());
    }

无论是使用嵌套查询还是嵌套结果的方式,都需要在Mapper.xml文件中定义相应的SQL语句和映射关系。同时,为了提高查询性能,可以使用Mybatis的延迟加载机制来减少查询次数,提高数据访问效率。

到此这篇关于Mybatis实现一对多映射处理的文章就介绍到这了,更多相关Mybatis映射内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java使用Nagao算法实现新词发现、热门词的挖掘

    java使用Nagao算法实现新词发现、热门词的挖掘

    这篇文章主要介绍了java使用Nagao算法实现新词发现、热门词的挖掘的思路和详细代码,需要的朋友可以参考下
    2015-07-07
  • Spring中Bean注入源码示例解析

    Spring中Bean注入源码示例解析

    这篇文章主要为大家介绍了Spring中Bean注入源码示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • Nacos配置中心搭建及动态刷新配置及踩坑记录

    Nacos配置中心搭建及动态刷新配置及踩坑记录

    这篇文章主要介绍了Nacos配置中心搭建及动态刷新配置及踩坑记录,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • 关于Kill指令停掉Java程序的问题

    关于Kill指令停掉Java程序的问题

    这篇文章主要介绍了Kill指令停掉Java程序的思考,主要探究kill指令和java的关闭钩子的问题,需要的朋友可以参考下
    2021-10-10
  • java实现简单学生成绩档案管理系统

    java实现简单学生成绩档案管理系统

    这篇文章主要为大家详细介绍了java实现简单学生成绩档案管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • SpringBoot快速构建应用程序方法介绍

    SpringBoot快速构建应用程序方法介绍

    这篇文章主要介绍了SpringBoot快速构建应用程序方法介绍,涉及SpringBoot默认的错误页面,嵌入式Web容器层面的约定和定制等相关内容,具有一定借鉴价值,需要的朋友可以参考下。
    2017-11-11
  • Mybatis-Plus中update()和updateById()将字段更新为null

    Mybatis-Plus中update()和updateById()将字段更新为null

    本文主要介绍了Mybatis-Plus中update()和updateById()将字段更新为null,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • Springboot整合多数据源代码示例详解

    Springboot整合多数据源代码示例详解

    这篇文章主要介绍了Springboot整合多数据源代码示例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • SpringBoot整合Swagger页面禁止访问swagger-ui.html方式

    SpringBoot整合Swagger页面禁止访问swagger-ui.html方式

    本文介绍了如何在SpringBoot项目中通过配置SpringSecurity和创建拦截器来禁止访问SwaggerUI页面,此外,还提供了禁用SwaggerUI和Swagger资源的配置方法,以确保这些端点和页面对外部用户不可见或无法访问
    2025-02-02
  • HashMap的底层实现原理分析

    HashMap的底层实现原理分析

    本文主要介绍了HashMap的底层实现结构,包括JDK1.7和1.8版本的区别,JDK1.7使用数组加链表实现,而JDK1.8引入了红黑树优化,文章详细解释了HashMap如何确定哈希桶数组索引位置、put方法的执行过程以及扩容原理
    2025-01-01

最新评论