• MyBatis笔记——多对一映射问题解决


    场景重现


    当想要查询一个部门下的所有员工时,多个员工对应一个部门

    实验使用的类和对象

    mapper.xml

    <select id="getEmpAndDept" resultMap="empAndDeptResultMapTwo">  
        select * from t_emp 
        left join t_dept on t_emp.did = t_dept.did    
        where t_emp.eid = #{eid}
    select>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    pojo:

    @Data  
    @AllArgsConstructor  
    @NoArgsConstructor  
    public class Emp {  
        private Integer eid;  
        private String empName;  
        private Integer age;  
        private String sex;  
        private String email;  
        private Dept dept;  
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    @Data  
    @AllArgsConstructor  
    @NoArgsConstructor  
    public class Dept {  
        private Integer did;  
        private String deptName;  
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    中直接使用 类.属性 来代表嵌套的pojo

    <resultMap id="empAndDeptResultMapOne" type="Emp">  
          
        <id property="eid" column="eid"/>  
        <result property="empName" column="emp_name"/>  
        <result property="age" column="age"/>  
        <result property="sex" column="sex"/>  
        <result property="email" column="email"/>  
        <result property="dept.did" column="did"/>  
        <result property="dept.deptName" column="dept_name"/>  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    使用类.属性解决


    中直接使用 类.属性 来代表嵌套的pojo

    <resultMap id="empAndDeptResultMapOne" type="Emp">  
          
        <id property="eid" column="eid"/>  
        <result property="empName" column="emp_name"/>  
        <result property="age" column="age"/>  
        <result property="sex" column="sex"/>  
        <result property="email" column="email"/>  
        <result property="dept.did" column="did"/>  
        <result property="dept.deptName" column="dept_name"/>  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    使用 解决

    <resultMap id="empAndDeptResultMapTwo" type="Emp">  
          
        <id property="eid" column="eid"/>  
        <result property="empName" column="emp_name"/>  
        <result property="age" column="age"/>  
        <result property="sex" column="sex"/>  
        <result property="email" column="email"/>  
        <association property="dept" javaType="dept">  
            <id property="did" column="did"/>  
            <result property="deptName" column="dept_name"/>  
        association>  
    resultMap>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    分布查询 解决


    1. 分别在两个表对应的mapper,使用能关联的字段进行查询

    Emp getEmpAndDeptByStepOne(Integer eid);
    
    • 1
    <select id="getEmpAndDeptByStepOne">  
        select *  
        from t_emp             
        left join t_dept on t_emp.did = t_dept.did    
        where t_emp.eid = #{eid}
    select>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    Dept getEmpAndDeptByStepTwo(Integer did);
    
    • 1
    <select id="getEmpAndDeptByStepTwo" resultType="com.zxb.mybatis.pojo.Dept">  
        select * from t_dept where did = #{did}  
    select>
    
    • 1
    • 2
    • 3

    2. 在主表的映射文件中,添加字段,并用该字段查询子表

    <resultMap id="empAndDeptByStepResultMap" type="Emp">  
          
        <id property="eid" column="eid"/>  
        <result property="empName" column="emp_name"/>  
        <result property="age" column="age"/>  
        <result property="sex" column="sex"/>  
        <result property="email" column="email"/>  
        <association property="dept" select="com.zxb.mybatis.mapper.DeptMapper.getEmpAndDeptByStepTwo" column="did"/>  
    resultMap>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    <select id="getEmpAndDeptByStepOne" resultMap="empAndDeptByStepResultMap">  
        select *  
        from t_emp             
        left join t_dept on t_emp.did = t_dept.did    
        where t_emp.eid = #{eid}
    select>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
  • 相关阅读:
    docker编译一个支持flv的nginx镜像
    SpringBoot+Mybatis 配置多数据源及事务管理
    电脑怎么保存网页到桌面上使用
    【漏洞复现】广联达OA漏洞合集(信息泄露+SQL注入+文件上传)
    【ARMv8/ARMv9 硬件加速系列 3.4 -- SVE 复制指令CPY 使用介绍】
    计算机网络-数据链路层
    紫色调城市和奔跑人物剪影背景工会工作总结汇报PPT模板
    快速自动化处理JavaScript渲染页面的方法
    05_用一个栈实现另一个栈的排序
    用Intel MediaSDK 做超高码率编码
  • 原文地址:https://blog.csdn.net/qq_66250368/article/details/138186596