延迟加载概念:需要用到数据时才进行加载,不需要用到数据时就不加载数据,延迟加载也叫做懒加载。
优点:先从单表查询,需要用的时候再从关联表去关联查询,大大提高数据库性能,因为查询单表要比关联查询多张表速度要快。
缺点:因为只有当需要用到数据时,才会进行数据库查询,在大批量数据查询时,因为查询工作也要耗费时间,所以造就用户用户等待时间较长,造成用户体验下降。
使用场景:
一对多,多对多:通常使用延迟加载。
一对一,多对一:通常使用立即加载。
注意:延迟加载是基于嵌套查询实现的
局部延迟加载
<!— 开启一对多 延迟加载 —>
<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的内容,这就是延迟加载的基本原理
延迟加载原理总结:
延迟加载主要是通过动态代理的形式实现,通过代理拦截到指定方法,执行数据加载。
网友评论