Mybatis延迟加载

延迟加载概念:需要用到数据时才进行加载,不需要用到数据时就不加载数据,延迟加载也叫做懒加载。

优点:先从单表查询,需要用的时候再从关联表去关联查询,大大提高数据库性能,因为查询单表要比关联查询多张表速度要快。

缺点:因为只有当需要用到数据时,才会进行数据库查询,在大批量数据查询时,因为查询工作也要耗费时间,所以造就用户用户等待时间较长,造成用户体验下降。

使用场景:

一对多,多对多:通常使用延迟加载。

一对一,多对一:通常使用立即加载。

注意:延迟加载是基于嵌套查询实现的

局部延迟加载

<!— 开启一对多 延迟加载 —>

<resultMap id = “UserMap" type = “user”> 

   <id cloumn=“id” property=“id”></id>

   <result column=“username” property=“username”></result>

   <!—  fetchType = “lazy 懒加载策略”

           fetchType = “eager  立即加载策略”

   —>

   <collection property=“orderList” ofType=“order” column=“id” select = “com.lagou.dao.orderMapper.findByUid” fetchType     =“lazy”>

   </collection>

</resultMap>

<select id = “findAll” resultMap = “userMap”>

   select * from `user`

</select>

全局延迟加载

在Mybatis的核心配置文件总可以使用setting标签修改全局的加载策略

<settings>

   <!— 开启全局延迟加载功能 —>

   <setting name = “lazyLoadingEnabled” value = “true"></setting>

</settings>

详细配置可参考官方文档的介绍:https://mybatis.org/mybatis-3/zh/configuration.html#settings

注意:局部的加载策略优先级高于全局的加载策略。

延迟加载原理:

使用CGLIB或Javassist(默认)创建目标对象的代理对象,当调用代理 对象的延迟加载属性的getting方法时,进入拦截器方法(invoke)。发现该方法需要延迟加载时,会单独发送事先保存好的查询关联对象的SQL,查询上来后调用set方法,为属性设置值,接着调用get方法,返回我们刚刚set的内容,这就是延迟加载的基本原理

延迟加载原理总结:

延迟加载主要是通过动态代理的形式实现,通过代理拦截到指定方法,执行数据加载。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Mybatis的延迟加载 一、什么是延迟加载 延迟加载:就是在需要用到数据时才进行加载,不需要用到数据时就不加载数...
    一只程序汪阅读 577评论 0 1
  • Mybatis 中一对一,一对多,多对多关系的配置及实现,可以实现对象的关联查询。实际开发过程中很多时候我们并不需...
    飞扬code阅读 791评论 0 2
  • 延迟加载的含义 延迟加载又叫按需查询(懒加载),mybatis支持延迟加载,我们希望一次性把常用的级联数据通过sq...
    Clark_阅读 855评论 0 0
  • mybatis的延迟加载策略 延迟加载:在需要用到数据时才进行加载,不需要用到数据时就不加载数据。延迟加载也称懒加...
    哈哈大圣阅读 575评论 0 8
  • 5.1 什么是延迟加载 resultMap可以实现高级映射(使用association、collection实现...
    飞扬code阅读 343评论 0 2

友情链接更多精彩内容