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>
结果
一:
二: