• 处理多对一映射关系的三种方法


     多对一关系实例:

    员工表:

     部门表:


    员工-部门关系表中,多个员工对应一个部门,要想在员工表中查询出对应的部门名,就要解决多对一映射。

    解决方法:

    首先:Emp实体类中添加Dept属性

    public class Emp {
    
        private Integer empId;
        private String empName;
        private Integer age;
        private String gender;
        private Dept dept;
    }

     然后:有三种方式解决此问题

    1. 级联

    级联方式:多对一的映射关系 
           
           

    dept.deptId,dept.deptName这两个属性爆红没有影响

    注意>双引号中一定不能有空格

    1. <resultMap id="getEmpAndDeptByEmpIdone" type="emp">
    2. <id column="emp_id" property="empId">id>
    3. <result column="emp_name" property="empName">result>
    4. <result column="age" property="age">result>
    5. <result column="gender" property="gender">result>
    6. <result column="dept_id" property="dept.deptId">result>
    7. <result column="dept_name" property="dept.deptName">result>
    8. resultMap>
    1. <select id="getEmpAndDept" resultMap="getEmpAndDeptByEmpIdone">
    2. select t_emp.*,t_dept.*
    3. from t_emp LEFT join t_dept
    4. on t_emp.dept_id = t_dept.dept_id
    5. where t_emp.emp_id = #{empId}
    6. select>

    2.association

    association : 专门处理多对一、一对一 的映射关系 处理实体类型属性

    property:设置需要处理映射关系的属性的属性名

    javaType:设置需要处理的属性的类型

    1. <resultMap id="getEmpAndDeptByEmpId" type="emp">
    2. <id column="emp_id" property="empId">id>
    3. <result column="emp_name" property="empName">result>
    4. <result column="age" property="age">result>
    5. <result column="gender" property="gender">result>
    6. <association property="dept" javaType="Dept">
    7. <id column="dept_id" property="deptId">id>
    8. <result column="dept_name" property="deptName">result>
    9. association>
    10. resultMap>
    1. <select id="getEmpAndDept" resultMap="getEmpAndDeptByEmpId">
    2. select t_emp.*,t_dept.*
    3. from t_emp LEFT join t_dept
    4. on t_emp.dept_id = t_dept.dept_id
    5. where t_emp.emp_id = #{empId}
    6. select>

    3. 分布查询

    通过分布查询,处理多对一的情况

    分别通过两个mapper查询各自的实体类属性,然后在通过association标签做两个之间的关联

    property:设置需要处理映射关系的属性的属性名

    select: 表明当前属性是调用select指定的这个方法查询出来的结果

    column: 上面select中指定方法sql中的查询条件为XXX 

    主要是通过resultMap中的assocation实现的。

    优点:可以延迟加载(多部查询,如果只需要其中一个步的结果那么就可以通过延迟加载设置。)

    全局配置:

    在配置文件(mybatis-config.xml)中设置

    1. <settings>
    2. <setting name="lazyLoadingEnabled" value="true"/>
    3. <setting name="aggressiveLazyLoading" value="false"/>
    4. settings>

    局部配置:

    在某一个多步查询中设置延迟加载

    fetchType="lazy"设置延迟加载

    fetchType="eager"立即加载

    1. <association property="dept" fetchType="lazy"
    2. select="com.zt.mybatis.mapper.DeptMapper.getEmpAndDeptByStepTwo"
    3. column="dept_id">
    4. association>

    具体看代码:

    EmpMapper:

    1. !-- 使用分布查询的方法处理多对
    2. Emp getEmpAndDeptByStepOne(@Param("empId") Integer empId);
    3. -->
    4. <resultMap id="getEmpAndDeptByStepOne" type="emp">
    5. <id column="emp_id" property="empId">id>
    6. <result column="emp_name" property="empName">result>
    7. <result column="age" property="age">result>
    8. <result column="gender" property="gender">result>
    9. <association property="dept"
    10. select="com.zt.mybatis.mapper.DeptMapper.getEmpAndDeptByStepTwo"
    11. column="dept_id">
    12. association>
    13. resultMap>
    14. <select id = "getEmpAndDeptByStepOne" resultMap="getEmpAndDeptByStepOne">
    15. select * from t_emp where emp_id = #{empId}
    16. select>

    DeptMapper:

    1. <select id="getEmpAndDeptByStepTwo" resultType="dept">
    2. select *
    3. from t_dept where dept_id = #{deptId};
    4. select>

    查询结果:

    1. Preparing: select * from t_emp where emp_id = ? (BaseJdbcLogger.java:137)
    2. Parameters: 1(Integer) (BaseJdbcLogger.java:137)
    3. Preparing: select * from t_dept where dept_id = ?; (BaseJdbcLogger.java:137)
    4. Parameters: 1(Integer) (BaseJdbcLogger.java:137)
    5. Total: 1 (BaseJdbcLogger.java:137)
    6. Total: 1 (BaseJdbcLogger.java:137)
    7. Emp(empId=1, empName=张三, age=12, gender=男, dept=Dept(deptId=1, deptName=A))

  • 相关阅读:
    【LeetCode-中等题】79. 单词搜索
    [CSS入门到进阶] 你真的了解 width height 吗?
    TVTK-SV02 数据管线简介
    js获取页面中某个元素的中心位置
    P5766最优联通子集题解
    分布式事务保姆级教程
    Optional详解
    Java项目:springboot+vue电影院会员管理系统
    解决“service nginx does not support chkconfig”的问题?
    ARM64-内嵌汇编
  • 原文地址:https://blog.csdn.net/qq_41950447/article/details/127760755