懒加载与急加载FetchType.LAZY&FetchType.EAGER的区别和使用?

简介: 1、FetchType.LAZY:懒加载,加载一个实体时,定义懒加载的属性不会马上从数据库中加载。2、FetchType.EAGER:急加载,加载一个实体时,定义急加载的属性会立即从数据库中加载。

1、FetchType.LAZY:懒加载,加载一个实体时,定义懒加载的属性不会马上从数据库中加载。2、FetchType.EAGER:急加载,加载一个实体时,定义急加载的属性会立即从数据库中加载。3、比方User类有两个属性,name跟address,登录后用户名是需要显示出来的,此属性用到的几率极大,要马上到数据库查,用急加载;而用户地址大多数情况下不需要显示出来,只有在查看用户资料是才需要显示,需要用了才查数据库,用懒加载就好了。所以,并不是一登录就把用户的所有资料都加载到对象中,于是有了这两种加载模式。

我们来用一个典型的案例作对比
一个用户有编号 用户名 ......和角色,正常情况下用户登录后不需要查询角色,但是现在我们想要查询到角色 一个用户可以有多个角色,员工角色是两张表 ,一般我们在项目配置中都是配置延迟加载(懒加载)

<configuration>
<!-- 启用延迟加载 -->
 <settings>
    <setting name="lazyLoadingEnabled" value="true" />
    <!--&lt;!&ndash;设置为false之后表示在访问many方的属性(非关联的对象的属性)的时候不要触发延迟加载&ndash;&gt;-->
    <setting name="aggressiveLazyLoading" value="false" />
    <!--&lt;!&ndash;当访问Object中的clone方法的时候触发延迟加载&ndash;&gt;-->
    <setting name="lazyLoadTriggerMethods" value="clone" />
</settings>

</configuration>
img_604f6a1c199976dbc68a083905a4bf01.png
延迟加载

我们在项目中有查询角色的sql(根据员工编号查询角色)

<collection property="roles" ofType="Role"
    select="com.jd.wms.mapper.RoleMapper.selectRolesByEmployeeId"
    column="id">
</collection>

调用RoleMapper里的方法查询角色


img_ef8d13e0054a6eebf36380a6b5a11e1b.png
EmployeeMapper.xml

sql查询出结果每一个用户id编号对应的角色

<select id="selectRolesByEmployeeId" resultMap="base_mapper">
    select r.* from t_employees_roles er join t_role r on er.role_id=r.id 
    where er.employee_id = #{empId}
</select>
img_10f9440e6d5870377e55541b3fb9cd52.png
RoleMapper.xml

查询出的结果是

img_cf58f30d6a4f2b61fb3ca3ed1611d2b4.png
查询结果

我们明明写了查询语句但是却没有查询到原因就是我们启用了延迟加载

现在我们的需求是需要把角色也显示出来怎么破?
这时我们就需要使用fetchType.eager(急加载)
添加一个属性fetchType="eager"

<collection property="roles" ofType="Role"   
 select="com.jd.wms.mapper.RoleMapper.selectRolesByEmployeeId"
 column="id" fetchType="eager">
</collection>
img_954fa83097467ea86fbc56b1e9fa000e.png
fetchType.eager

这时我们发送请求得到的结果就是

img_0c761209657e1c8fc37d9e4dfea142e9.png
目录
相关文章
|
1月前
|
缓存 JavaScript 前端开发
同步加载、异步加载、延迟加载、预加载的区别
同步加载、异步加载、延迟加载、预加载的区别
126 0
|
1月前
|
Java Spring 容器
面试题:在spring框架下面,Bean的属性lazy-init有什么作用,默认值是多少
面试题:在spring框架下面,Bean的属性lazy-init有什么作用,默认值是多少
20 0
|
Java Spring 容器
Spring系列(五):@Lazy懒加载注解用法介绍
@Lazy 懒加载注解的概念 SpringIoC容器会在启动的时候实例化所有单实例 bean 。如果我们想要实现 Spring 在启动的时候延迟加载 bean,即在首次调用bean的时候再去执行初始化,就可以使用 @Lazy 注解来解决这个问题
Spring系列(五):@Lazy懒加载注解用法介绍
|
10月前
|
JavaScript 前端开发 UED
延迟加载是什么,怎么使用?
延迟加载是什么,怎么使用?
66 0
|
11月前
|
数据采集 搜索推荐 UED
实现懒加载
懒加载是一种非常 useful 的技术,可以极大提高用户体验和网页性能,但也有一定的弊端,需要权衡选择。一般来说,对于加载的数据较多,页面性能和流量较为关注的场景,懒加载是一个不错的方案。但如果对 SEO 优化要求较高,或者加载的数据较少,也可以不使用懒加载
52 0
|
Java Spring
@Lazy注解简单理解
@Lazy注解简单理解
318 0
|
移动开发 前端开发 UED
前端加载之懒加载
懒加载就是延时加载,也被称为按需加载。
444 0
|
SQL 缓存 Java
多次缓存和懒加载你都懂了吗?(下)
一级缓存的作用域是SQLSession,同一个SqlSession中执行相同的SQL查询(相同的SQL和参数),第一次会去查询数据库并写在缓存中,第二次会直接从缓存中取,且在mybatis中式默认开启默认开启一级缓存
346 0
多次缓存和懒加载你都懂了吗?(下)
|
SQL 存储 缓存
多次缓存和懒加载你都懂了吗?(上)
程序经常要调用的对象存在内存中,方便其使用时可以快速调用,不必去数据库或者其他持久化设备中查询,主要就是提高性能
223 0