一、什么叫延迟加载
- 延迟加载,也被称为是嵌套查询,或者懒加载。用于嵌套查询的时候
- 结合resultMap标签中的association和collection子标签使用,用于一对一、一对多等嵌套查询
- 延迟二字就是体现在嵌套查询时,如果不访问被嵌套的数据,那么就不会查询出嵌套的数据,比如查询某个用户下所有的订单,但是最开始只需要显示用户信息,点击订单详情的时候才显示订单明细,如果能做到开始只用户信息,点击订单详情的时候再查询订单明细,就不需要进行两表联查了,可以提高查询的效率,节省内存,这就是延迟加载
二、延迟加载分类
- 直接加载(不算延迟加载): 执行完对主加载对象的select语句,马上执行对关联对象的select查询
- 侵入式延迟: 执行对主加载对象的查询时,不会执行对关联对象的查询。但当要访问主加载对象的某个属性(该属性不是关联对象的属性)时,就会马上执行关联对象的select查询。
- 深度延迟: 执行对主加载对象的查询时,不会执行对关联对象的查询。访问主加载对象的详情时也不会执行关联对 象的select查询。只有当真正访问关联对象的详情时,才会执行对关联对象的select查询
三、延迟加载配置
侵入式延迟
<settings>
<!-- 延迟加载总开关,默认false -->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 侵入式延迟加载开关 -->
<setting name="aggressiveLazyLoading" value="true"/>
</settings>
深度延迟
<settings>
<!-- 延迟加载总开关,默认false -->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 侵入式延迟加载开关 -->
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
四、实现原理
mybatis框架实现的时候,对于主信息是直接查询,而关联的从信息,要在业务代码里面要访问那个属性,这个属性属于哪个关联表,那么就查询这个关联表,以此不断查询关联表
五、优劣
优:
深度延迟加载的使用会提升性:毕竟用的时候才访问
劣:
如果延迟加载的关联表数据太多,此时会产生1+
N
问题:
- 主信息加载一次算1次,
- 从信息是会根据主信息传递过来的条件,去查询从表多次