一、延迟加载
MyBatis中的延迟加载,也称为懒加载,是指在进行关联查询时, 按照设置延迟规则推迟对关联对象的select查询。延迟加载可以有效的减少数据库压力。
MyBatis的延迟加载只是对关联对象的查询有延迟设置,对于主加载对象都是直接执行查询语句的。
二、关联对象的加载时机
MyBatis根据对关联对象查询的select语句的执行时机,分为三种类型:直接加载、侵入式延迟加载、深度延迟加载。
- 直接加载:执行完对主加载对象的select语句,马上执行对关联对象的select查询。
- 侵入式延迟加载:执行对主加载对象的查询时,不会执行对关联对象的查询。但当要访问主加载对象的详情时,就会马上执行关联对象的select查询,即对关联对象的查询执行,侵入到主加载对象的详情访问中。(将关联对象的详情侵入到了主加载对象的详情中,即将关联对象的详情作为主加载对象的详情一 部分出现)
- 深度延迟加载:执行对主加载对象的查询时,不会执行对关联对象的查询。访问主加载对象的详情时也不会执行关联对象的select查询。只要当真正访问关联对象的详情时,才会执行对关联对象的select查询。
示例:建立country和minister的DB表
直接加载示例:
<setting name="lazyLoadingEnabled" value="flase"/>
上面的语句,系统默认设置为“false”
输出:
深度延迟加载示例(只访问cname,就不查minister表,提高了效率):
<!--设置整个应用所使用的常量 --> <settings> <setting name="lazyLoadingEnabled" value="true"/>//系统默认"aggressiveLazyLoading"为false </settings>
"lazyLoadingEnabled"类似于开关功能。
@Test public void test01() { Country country = dao.selectCountryById(1); System.out.println(country.getCname()); }
执行顺序如下(当前“aggressiveLazyLoading”为false):
侵入式延迟示例:
<settings> <setting name="lazyLoadingEnabled" value="true"/> <setting name="aggressiveLazyLoading" value="true"/> </settings>
执行顺序如下:
总结: