美文网首页
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