myabtis 中是否支持延迟加载?如果支持,它的实现原理是什么
myabtis 中是否支持延迟加载?如果支持,它的实现原理是什么
程序员朱永胜有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步, 认准
https://blog.zysicyj.top
全网最细面试题手册,支持艾宾浩斯记忆法。这是一份最全面、最详细、最高质量的 java 面试题,不建议你死记硬背,只要每天复习一遍,有个大概印象就行了。https://store.amazingmemo.com/chapterDetail/1685324709017001`
MyBatis 中的延迟加载
MyBatis 确实支持延迟加载,也称为懒加载(Lazy Loading)。延迟加载是一种优化技术,在对象的关联属性被真正使用时才加载其数据,而不是在查询主对象时就加载所有的关联属性。这样可以提高性能,尤其是当关联的数据量很大或者关联层次很深时。
实现原理
MyBatis 的延迟加载实现原理主要依赖于代理对象。当查询操作返回一个对象时,如果配置了延迟加载,MyBatis 会为关联的属性生成一个代理对象。这个代理对象内部包含了真正加载数据所需的参数和映射语句。当程序第一次访问这个代理对象的某个方法时,代理对象会触发一个加载过程,即执行预先定义的映射语句来从数据库中加载数据。
以下是实现延迟加载的步骤:
- 配置开启延迟加载 :在 MyBatis 的配置文件中设置
lazyLoadingEnabled
为true
来开启延迟加载。
1 | <settings> |
- 配置触发加载的方法 :可以通过
aggressiveLazyLoading
配置项来控制何时触发加载。如果设置为true
,则任何关联对象的方法调用都会加载数据;如果设置为false
,则只有当访问关联对象的属性时才会触发加载。
1 | <settings> |
- 使用 association 和 collection 配置关联映射 :在映射文件中,使用
association
(对于一对一关系)和collection
(对于一对多关系)标签来配置关联映射,并指定fetchType
为lazy
。
1 | <mapper> |
- 访问关联属性触发加载 :在应用代码中,当访问对象的关联属性时,如果该属性尚未加载,MyBatis 会执行关联的映射语句来加载数据。
1 | Blog blog = blogMapper.selectBlog(1); |
通过以上步骤,MyBatis 可以实现延迟加载,从而提高应用性能。