美文网首页
Mybatis延迟加载

Mybatis延迟加载

作者: 何佳阳 | 来源:发表于2020-12-10 00:54 被阅读0次

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

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

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

使用场景:

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

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

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

局部延迟加载

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

<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的内容,这就是延迟加载的基本原理

延迟加载原理总结:

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

相关文章

网友评论

      本文标题:Mybatis延迟加载

      本文链接:https://www.haomeiwen.com/subject/ohflgktx.html