首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Mybatis高级查询(四):延迟加载

Mybatis高级查询(四)

延迟加载 (懒加载)

延迟加载的好处:先从单表查询、需要时再从关联表去关联查询,大大提高 数据库性能,因为查询单表要比关联查询多张表速度要快。

延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作;

可以简单理解为,只有在使用的时候,才会发出sql语句进行查询;

总结:需要查询关联信息时,使用mybatis延迟加载特性可有效的减少数据库压力,首次查询只查询主要信息,关联信息等用户获取时再加载。

延迟加载其实就是将数据加载时机推迟,比如推迟嵌套查询的执行时机。在Mybatis中经常用到关联查询,但是并不是任何时候都需要立即返回关联查询结果。比如查询订单信息,并不一定需要及时返回订单对应的产品信息,查询商品分类信息并不一

定要及时返回该类别下有哪些产品,这种情况一下需要一种机制,当需要查看时,再执行查询,返回需要的结果集,这种需求在Mybatis中可以使用延迟加载机制来实现。延迟加载可以实现先查询主表,按需实时做关联查询,返回关联表结果集,一定程度上提高了效率。

使用延迟加载

在resultMap中使用association或者collection,即可使用延迟加载。

延迟加载需要两个statement语句(sql语句)来完成;

在resultMap中使用association或者collection来配置两个statement直接的管理;

两个statement直接必须存在关联的数据列(有一个字段让两个表联系起来);

在Mapper.xml中做如下配置

<!--订单表的信息-->
    <id column="id" property="id"/>
    <result column="user_id" property="userId"/>
    <result column="number" property="number"/>
    <result column="createtime" property="createtime"/>
    <result column="note" property="note"/>

<!--延迟加载部分-->
    <association property="user"
                 javaType="com.mb.pojo.User"
                 column="user_id"
                 select="findUserByUserId">
开启延迟加载

Mybatis的延迟加载功能默认是关闭的;

需要在SqlMapConfig.xml文件中通过setting标签配置来开启延迟加载功能;

开启延迟加载的属性:

<settings>
    <!-- 启用延迟加载特性,不配置默认关闭该特性-->
    <setting name="lazyLoadingEnabled" value="true"/>
    <!-- 关闭积极加载-->
    <setting name="aggressiveLazyLoading" value="false"/>
</settings>
注意事项

延迟加载有时候会取不到值的问题:mybatis延迟加载是通过动态代理实现的,当调用配置为延迟加载的属性方法时,动态代理的操作会被触发,这些额外的操作就是通过mybatis的sqlSession去执行嵌套的SQL的。由于在和某些框架集成时,sqlSession的生命周期交给了框架来管理,因此当对象超出sqlsession生命周期调用时,会由于链接关闭等问题而抛出异常。在和spring集成时,要确保只能在Service层调用延迟加载的属性。当结果从service层返回至Controller层时,如果获取延迟加载的属性值,会因为sqlsession已经关闭而抛出异常。

举报
领券