cuterabbitbaby 2020-02-23
MyBatis的Lazy Loading可以实现延迟查询Bean里的嵌套成员类,控制lazy loading的<settings>属性有
lazyLoadingEnabled: lazy loading开关
aggressiveLazyLoading: 侵略性 lazy loading 开关
设置项 | 描述 | 允许值 | 默认值 |
lazyLoadingEnabled | 全局性设置懒加载。如果设为‘false’,则所有相关联的都会被初始化加载。 | true | false | 3.4.1后为false |
aggressiveLazyLoading | 当设置为‘true’的时候,懒加载的对象可能被任何懒属性全部加载。否则,每个属性都按需加载。 | true | false | 3.4.1后为true |
延迟加载
延迟加载对主对象都是直接加载,只有对关联对象是延迟加载。
延迟加载可以减轻数据库的压力,
延迟加载不可是一条SQL查询多表信息,这样构不成延迟加载,会形成直接加载。
延迟加载分为三种类型:
1.直接加载
执行完主对象之后,直接执行关联对象。
2.侵入式加载
在执行主对象详情的时候,执行关联对象。
3.深度延迟加载
执行完主对象或主对象详情不会执行关联对象,只有用到关联对象数据的时候才走深度延迟加载。
看一下几个例子
1.默认情况的延迟加载 (这是在MyBatis3.4.1版本之前的默认情况) :(aggressiveLazyLoading)侵入式延迟加载为true, 在3.4.1之后的版本(aggressiveLazyLoading)侵入式延迟加载默认值为false
2.侵入式延迟加载
现在看一下访问主属性的侵入式延迟加载的状态如何
3.深度延迟加载
深度延迟加载 大配置中的设置
只访问主对象的属性,深度延迟加载的状态为:
现在我们看一下访问关联对象的属性,深度延迟加载的状态为:
我现在用的mybatis3.5.3的默认值为:<settings> <setting name="lazyLoadingEnabled" value="false"/> <setting name="aggressiveLazyLoading" value="true"/> <!--现在的状态为直接加载-->(3.4.1版本之后的直接加载设置)</settings>所以改为深度延迟加载即
<settings> <setting name="lazyLoadingEnabled" value="true"/> <setting name="aggressiveLazyLoading" value="false"/> <!--现在的状态为直接加载-->(3.4.1版本之后的直接加载设置)</settings>建议修改懒加载时这两个设置项同时修改