mybatis延迟加载策略(个人笔记)
程序员文章站
2022-03-09 20:38:44
场景分析:关联查询中,当我们要查询员工信息的时候又不想把员工的工作信息或者其他关联信息查询出来但是我们使用关联查询时,会自动帮我们一起查询出来此时我们可以发现,这无疑是加重数据库的工作量所以引出延迟加载和立即加载的特性:延迟加载:在真正使用数据的时候才发起查询,不用的时候不查询关联的数据,延迟加载又叫按需查询(懒加载)立即加载:不管用不用,只要一调用方法,马上发起查询。使用场景:在对应的四种表关系中,一对多、多对多通常情况下采用延迟加载,多对一、一对一通常情况下采用立即加载操作步骤:在m...
场景分析:
关联查询中,当我们要查询员工信息的时候
又不想把员工的工作信息或者其他关联信息查询出来
但是我们使用关联查询时,会自动帮我们一起查询出来
此时我们可以发现,这无疑是加重数据库的工作量
所以引出延迟加载和立即加载的特性:
延迟加载:在真正使用数据的时候才发起查询,不用的时候不查询关联的数据,延迟加载又叫按需查询(懒加载)
立即加载:不管用不用,只要一调用方法,马上发起查询。
使用场景:在对应的四种表关系中,一对多、多对多通常情况下采用延迟加载,多对一、一对一通常情况下采用立即加载
操作步骤:
- 在mybatis配置文件中配置settings属性
lazyLoadingEnabled : 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置fetchType属性来覆盖该项的开关状态
aggressiveLazyLoading : 当启用时,对任意延迟属性的调用会使带有延迟加载属性的对象完整加载;反之,每种属性将会按需加载。
<settings>
<!-- 开启mybatis支持延迟加载 -->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 关闭mybatis积极的延迟加载,即按需加载 -->
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
- mapper映射文件改为分布查询。
association 中的column属性 :设置关联查询中哪个作为主键关联查询
一对一:使用javaType(实体类中Java属性)
一对多:使用ofType(List中<>的属性)
<select id="selectEmployeeFenbu" resultMap="fenbu">
select * from employee;
</select>
<resultMap type="employee" id="fenbu">
<id property="empId" column="empid"/>
<result property="name" column="name"/>
<result property="gender" column="gender"/>
<result property="birthday" column="birthday"/>
<result property="mobile" column="mobile"/>
<result property="email" column="email"/>
<result property="note" column="note"/>
<association property="workcard" javaType="WorkCard" column="empid"
select="com.zwh.mapper.EmployeeMapper.fenbu"></association>
</resultMap>
<?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.zwh.mapper.EmployeeMapper">
<select id="fenbu" parameterType="integer" resultType="WorkCard">
select * from workcard where empid=#{empid]};
</select>
</mapper>
- test测试:
@Test
public void selectEmployeeFenbu() {
SqlSession sqlSession = MybatisUtils.getSession();
EmployeeDao mapper = sqlSession.getMapper(EmployeeDao.class);
List<Employee> selectEmployeeFenbu = mapper.selectEmployeeFenbu();
for (Employee employee : selectEmployeeFenbu) {
System.out.println(employee);
//按需加载,如果需要查询关联信息则会自动全部加载
//System.out.println(employee.getWorkcard());
}
}
本文地址:https://blog.csdn.net/ZhaZha__Hui/article/details/109004400