分步查询——懒加载模式
目录
- 懒加载模式示例
- 不使用懒加载
- 使用懒加载
- aggressiveLazyLoading
- lazyLoadTriggerMethods
所谓懒加载,也称延时加载,是指不一下子加载完全部资源。需要用到哪些资源才去加载这些资源,用不到的资源,就不去加载他,以达到节约资源,优化的目的。分步查询中存在懒加载现象。
懒加载模式示例
不使用懒加载
首先看一下不使用懒加载的情况下,是如何运行的。
我们执行的代码,不涉及到 customer 的资源,但是如果不适用懒加载,它依旧会加载。
public void test2(){SqlSession sqlSession = MybatisUtils.openSession();OrderMapper mapper = sqlSession.getMapper(OrderMapper.class);Order order = mapper.getOrderWithId(2); // 不需要加载 customer 的资源sqlSession.close();
}
运行效果:可见,分步查询中,即使我们没有用到 customer 的资源,它依旧执行了语句,加载了资源。
使用懒加载
如果我们开启懒加载会怎么样呢,在 MyBatis 配置文件中如下配置:
<settings><!--配置sql打印--><setting name="logImpl" value="STDOUT_LOGGING"/><!--延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。--><setting name="lazyLoadingEnabled" value="true"/>
</settings>
再去执行上面那段代码,可见,分步查询中,我们没有用到 customer 的资源,则它根本没有去执行 customer 的查询语句,在大项目中是十分节约资源的。
只有当我们用到了 customer 的资源,它才会去加载,如下:
public void test2(){SqlSession sqlSession = MybatisUtils.openSession();OrderMapper mapper = sqlSession.getMapper(OrderMapper.class);Order order = mapper.getOrderWithId(2); // 实现分步查询System.out.println(order.getCustomer().getCust_name()); // 需要加载 customer 的资源sqlSession.close();
}
aggressiveLazyLoading
<!--当开启时,任何方法的调用都会加载该对象的所有属性。否则,每个属性会按需加载-->
<setting name="aggressiveLazyLoading" value="false"/>
这个设置在 3.4.1 之前都是默认为 true,我们需要手动设置为 false。(新版中已经默认为 false)
lazyLoadTriggerMethods
默认 toString() 方法是不触发延迟加载的,只要涉及到 toString() 方法就会加载全部的资源。这个设置可以指定 toString() 及一些方法触发延迟加载。
<!--指定哪个对象的方法触发一次延迟加载。-->
<setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode"/>