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;
    }
}

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;
    }
}

编写接口类

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);

}

编写对应的映射文件

值得注意的是;对department进行映射时;使用关键字<assocication>;使用<fetchType=“lazy”>指定加载方式;在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>

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

<settings>
        <setting name="logImpl" value="LOG4J"/>
        
        <!--        开启懒加载(开启延迟加载)-->
        <setting name="lazyLoadingEnabled" value="true"/>

        <!--        关闭实时加载-->
        <setting name="aggressiveLazyLoading" value="false"/>

        <!--        开启二级缓存-->
        <setting name="cacheEnabled" value="true"/>
    </settings>

结果

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

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>