延迟加载
MyBatis 中的延迟加载,也称为懒加载,是指在进行关联查询时,按照设置延迟规则推 迟对关联对象的 select 查询。延迟加载可以有效的减少数据库压力。
需要注意的是,MyBatis 的延迟加载只是对关联对象的查询有迟延设置,对于主加载对象都是直接执行查询语句的。
关联对象加载时机
MyBatis 根据对关联对象查询的 select 语句的执行时机,分为三种类型:直接加载、侵 入式延迟加载与深度延迟加载。
1.直接加载:执行完对主加载对象的select语句,马上执行对关联对象的select查询
2.侵入式延迟加载:执行完主加载对象的查询时,不会马上执行对关联对象。但当要访问主加载对象的详情时,
就会马上执行关联对象的select查询。即对关联对象的查询执行,侵入到了主加载对象的详情中
即将关联对象的详情作为主加载对象详情的一部分出现了
3.深度延迟加载:执行对主加载对象的查询时,不会执行对关联对象的查询。访问主加载对象 的详情时也不会执行关联对象的 select 查询。
只有当真正访问关联对象的详情时,才会 执行对关联对象的 select 查询
需要注意的是,延迟加载的应用要求,关联对象的查询与主加载对象的查询必须是分别 进行的 select 语句,
不能是使用多表连接所进行的 select 查询。因为,多表连接查询,其实 质是对一张表的查询,
对由多个表连接后形成的一张表的查询。会一次性将多张表的所有信 息查询出来。
MyBatis 中对于延迟加载设置,可以应用到一对一、一对多、多对一、多对多的所有关 联关系查询中
1 <!-- 三种加载方式:1.直接加载 2.侵入延迟加载 3.深度延迟加载 其中深度延迟加载最 lazy, 其次 是侵入延迟加载--> 2 <settings> 3 <!-- 延迟加载总开关--> 4 <!-- 默认为false,不采用延迟加载,即采用直接加载 --> 5 <!-- 直接加载:执行完主加载对象的 select 语句,马上执行关联对象的 select 语句 --> 6 <!-- 因为侵入延迟加载 默认不开启,所以当开启延迟加载后,采用的 深度延迟加载(即用到了才去加载,发出SQL,在 hibernate 中是load方法 和 fetchType ,都是类似这种深度延迟加载 ) --> 7 <setting name="lazyLoadingEnabled" value="true" /> 8 9 <!-- 侵入延迟加载的开关 默认为false,开启后,即采用侵入延迟加载 --> 10 <!-- 侵入延迟加载:该延迟策略使关联对象的数据侵入到了主加载对象的数据中,当主加载对象的数据被调用时,关联对象 随之被调用 ,即当对象中属性被使用后,就要发出SQL语句去加载关联对象--> 11 12 <setting name="aggressiveLazyLoading" value="true"/> 13 </settings>
延迟加载策略总结
时间: 2024-11-08 18:17:00