MyBatis延迟加载和缓存

随声附和 提交于 2019-12-01 08:19:22

1、延迟加载(lazyLoadingEnable)

      (1)什么是延迟加载

         MyBatis中的延迟加载,也称为懒加载,是指在进行关联查询的时候,按照设 置延迟加载规则推迟对关联对象的select检索。延迟加载可以有效的减少数据库 的压力。

              注意:MyBatis的延迟加载只是对关联对象的查询有延迟设置,对于主加载对象 都是直接执行查询语句的。

加载时机:

直接加载:即执行对象的select语句,完成对主加载马上执行对关联对象的select查询。

 侵入式延迟加载:执行对主加载对象的查询时,不会执行对关联对象的查询。但是当要访问主加载对象的详情时马上执行对关联对象的select查询。即对关联对象的执行查询,

侵入到了主加载对象的访问详情中。也可理解为:将关联对象的详情侵入到主加载对象的详情中去,即将关联对象的详情作为主加载对象的一部分出现了!

 

 深度延迟:执行对主加载对象的查询时,不会执行对关联对象的查询。访问主加载对象的详情时也不会执行关联对象的select查询。只有当真正访问关联对象的详情时,才会执行对关联对象的select查询。

 

注意的问题:延迟加载的应用要求:关联对象的查询与主加载对象的查询必须是分别进行的select语句,不能是使用多表连接所进行的select查询。因为,多表连接查询,实质是对一张表的查询,

对由多个表连接后形成的一张表的查询。会一次性将多张表的所有信息查询出来。

侵入式延迟加载配置方法:

 

 

 

 

Mybatis-config.xml大配置文件,首先开启延迟加载,然后再配置侵入式加载

 

不调用主加载对象时只有一条SQL

 

调用主加载对象的信息时会产生两条SQL

 

 

 

深度延迟加载方式:

Mybatis-config.xml大配置文件,首先开启延迟加载,然后再配置深度加载

 

 

调用主加载对象时不会执行第二条加载SQL

     

 

 

 

调用关联对象详细信息时会执行第二次查询

 

 

 

 

 

 

 

 

 

 

 2MyBatis的一级缓存

 

     使用缓存可以使应用更快地获取数据,避免和数据库的频繁地交互,尤其是在查询越多、缓存命中率越高的情况下,使用缓存的作用也就越明显。MyBatis作为持久性的ORM框架,提供了非常强大的查询缓存特性,可以非常方便的配置和使用。

 

 

 

 

 

 

1)关于缓存的说明

 

           MyBatis查询缓存机制。根据缓存区的作用域与生命周期,可划分两种

 

Ø  一级缓存

 

Ø   二级缓存

 

      MyBatis查询缓存的作用域是根据映射文件的namespace去划分的相同的namespacemapper查询放在同一个缓存区域。不同的namespace下的数据互不干扰。

 

无论是一级缓存还是二级缓存,都是按照namespace进行分别存放的。

 

  但是一级、二级缓存的不同之处在于,SqlSession对象一旦关闭,则SqlSession中的数据将不存在,即一级缓存就不复存在

二级缓存的生命周期与整个应用同步SqlSession是否关闭无关。换句话说,一级缓存是在同一个线程(同一SqlSession)间共享数据,而二级缓存是在不同线程(不同的SqlSession)间共享数据。

2)一级缓存存在的证明

测试代码

 

 

 

查看Console台上输出的日志:

 

 

 

3)增删改对一级缓存的影响                   

 

 

 测试代码

 

      查看Console台上输出的日志:

 

 

 

(4)一级缓存结论

1.       Mybatis框架天然集成一级缓存

2.       一级缓存查询依据为SQLID+SQL语句

3.       增删改会清空一级缓存

二级缓存

一.配置内置二级缓存

 

1.在大配置文件中开启二级缓存,默认为开启

 

 2.Mapper小配置文件中,添加缓存标签<cache/>

 

 运行测试代码

 

 

 

 

 

二.增删改对二级缓存的影响

增删改同样会清空二级缓存

 

 

 

 

 

 

 

 

调用关联对象详细信息时会执行第二次查询

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!