• Mybatis懒加载


    前言

    现有两张表emp、dept如下;
    当我们想要查询职员的所有信息时,需要涉及两张表;
    第一种方法——多表连接查询
    使用sql语句:“select * from emp left join dept on emp.deptno=dept.deptno;”
    但这仅仅是一种最普通的方法;
    如果信息量很大的时候,这种查询方法无疑是很耗时的;
    且我们可能不需要所有信息,在这个时候,程序员就增加了工作量。
    第二种方法——分步查询
    先查寻所有的职员信息:“select * from emp;”
    如果需要部门信息;再根据上一步查询的deptno查询部门信息查询部门信息:“select * from dept where no=dept.deptno”
    以上两个步骤都是单表查询;执行效率比多表查询高得多
    如果不需要部门信息,则不需要执行第二部,减少了额外的操作。
    emp:
    在这里插入图片描述
    dept:
    在这里插入图片描述

    什么是懒加载

    前言里说到的第二种分步操作的方式就是mybatis懒加载。
    懒加载通俗的说就是分步加载、按需加载;需要的时候再去操作
    在mybatis中,resultMap可以实现高级映射;assication、collection具备延迟加载功能

    mybatis实现懒加载

    对应表创建对应的类

    dept表对应类Department

    package com.pojo;
    
    import lombok.Data;
    
    import java.io.Serializable;
    
    /**
     * @author Una
     * @date 2022/8/19 13:40
     * @description:
     */
    
    @Data
    public class Department implements Serializable {
        private Integer deptNo;
        private String deptName;
        private String deptLoc;
        public Department() {
        }
        public Department(Integer deptNo, String deptName, String deptLoc) {
            this.deptNo = deptNo;
            this.deptName = deptName;
            this.deptLoc = deptLoc;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    emp对应User类
    在User中写入属性department,对应dept表的Department

    package com.pojo;
    
    import lombok.Data;
    
    import java.io.Serializable;
    import java.util.Date;
    
    /**
     * @author Una
     * @date 2022/8/19 13:36
     * @description:
     */
    
    @Data
    public class User implements Serializable {
        private Integer empNo;
        private String empName;
        private String empJob;
        private Integer empMgr;
        private Date empDate;
        private Double empSalary;
        private Double empComm;
        private Integer deptNo;
        private Department department;
    
        public User() {
        }
    
        public User(Integer empNo, String empName, String empJob, Integer empMgr, Date empDate, Double empSalary, Double empComm, Integer deptNo, Department department) {
            this.empNo = empNo;
            this.empName = empName;
            this.empJob = empJob;
            this.empMgr = empMgr;
            this.empDate = empDate;
            this.empSalary = empSalary;
            this.empComm = empComm;
            this.deptNo = deptNo;
            this.department = department;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    编写接口类

    getUser()方法用于第一步查询
    getAll(Integer id)方法用于进一步查询

    package com.mapper;
    
    import com.pojo.User;
    
    import java.util.List;
    
    /**
     * @author Una
     * @date 2022/8/19 13:45
     * @description:
     */
    
    
    public interface UserMapper {
        public List<User> getUser();
        public List<Department> getAll(Integer id);
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    编写对应的映射文件

    值得注意的是;对department进行映射时;使用关键字;使用指定加载方式;在select语言时;使用#{属性名}
    在这里插入图片描述

    <?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="com.mapper.UserMapper">
        <resultMap id="userMap" type="User">
            <id property="empNo" column="empno" javaType="java.lang.Integer"/>
            <result property="empName" column="empname" javaType="java.lang.String"/>
            <result property="empJob" column="job" javaType="java.lang.String"/>
            <result property="empMgr" column="mgr" javaType="java.lang.Integer"/>
            <result property="empSalary" column="salary" javaType="java.lang.Double"/>
            <result property="empComm" column="comm" javaType="java.lang.Double"/>
            <result property="deptNo" column="deptno" javaType="java.lang.Integer"/>
    
    
            <association property="department" column="deptno" select="getAll" fetchType="lazy"/>
        </resultMap>
        
        <resultMap id="deptMap" type="Department">
            <id property="deptNo" column="deptno" javaType="java.lang.Integer"/>
            <result property="deptName" column="dname" javaType="java.lang.String"/>
            <result property="deptLoc" column="loc" javaType="java.lang.String"/>
        </resultMap>
    
        <select id="getUser" resultMap="userMap">
            select * from emp;
        </select>
    
        <select id="getAll" resultMap="deptMap" parameterType="java.lang.Integer">
            select * from dept where deptno=#{id}
        </select>
    </mapper>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    在配置文件中开启懒加载;关闭实时加载

    <settings>
            <setting name="logImpl" value="LOG4J"/>
            
            
            <setting name="lazyLoadingEnabled" value="true"/>
    
            
            <setting name="aggressiveLazyLoading" value="false"/>
    
            
            <setting name="cacheEnabled" value="true"/>
        settings>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    结果

    一:
    在这里插入图片描述
    二:
    在这里插入图片描述
    在这里插入图片描述

  • 相关阅读:
    Nginx访问控制与虚拟主机
    LCR 101.分割等和子集
    01背包-采药
    python 词云 wordcloud使用paddle模式 庆余年人物分析--不是特别准,可以看着玩一玩
    测试驱动开发TDD
    No.4数据库及中间件
    高速数据采集与图像传输对带宽需求的对比分析
    【抽代复习笔记】21-群(十五):循环群引理及定义
    springboot毕设项目大型企业员工信息管理系统9thmk(java+VUE+Mybatis+Maven+Mysql)
    汇编 寻址方式
  • 原文地址:https://blog.csdn.net/m0_50744075/article/details/126422829