延迟加载,一级缓存,二级缓存

---恢复内容开始---

概念:

MyBatis中的延迟加载,也称为懒加载,是指在进行表的关联查询时,按照设置延迟规则推迟对关联对象的select查询。例如在进行一对多查询的时候,只查询出一方,当程序中需要多方的数据时,mybatis再发出sql语句进行查询,这样子延迟加载就可以的减少数据库压力。MyBatis 的延迟加载只是对关联对象的查询有迟延设置对于主加载对象都是直接执行查询语句的。

加载时机:

  • 直接加载:执行完对主加载对象的 select 语句,马上执行对关联对象的 select 查询。
  • 侵入式延迟: 执行对主加载对象的查询时,不会执行对关联对象的查询。但当要访问主加载对象的详情属性时,就会马上执行关联对象的select查询。
  • 深度延迟: 执行对主加载对象的查询时,不会执行对关联对象的查询。访问主加载对象的详情时也不会执行关联对象的select查询。只有当真正访问关联对象的详情时,才会执行对关联对象的 select 查询。

注意:延迟加载的应用要求:关联对象的查询与主加载对象的查询必须是分别进行的select语句,不能是使用多表连接所进行的select查询。因为,多表连接查询,实质是对一张表的查询,对由多个表连接后形成的一张表的查询。会一次性将多张表的所有信息查询出来。

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

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

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

 

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

 

深度延迟加载方式:  

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

     

     

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

     

     

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

    

    

一级缓存:  

 查询缓存的使用,主要是为了提高查询访问速度。将用户对同一数据的重复查询过程简化,不再每次均从数据库查询获取结果数据,从而提高访问速度。

    一.缓存的划分

        根据缓存区的作用域与生命周期课划分为:

          一级缓存(大配置文件setting节点name属性)

           

          二级缓存

          

二.缓存说明

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

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

    一级、二级缓存的不同之处在于,SqlSession一旦关闭,则SqlSession中的数据将不存在,即一级缓存就不复存在。而二级缓存的生命周期与整个应用同步,与SqlSession是否关闭无关。换句话说,一级缓存是在同一线程(同一SqlSession)间共享数据,而二级缓存是在不同线程(不同的SqlSession)间共享数据。

三.一级缓存存在证明

同一个会话(SqlSession)执行两次相同的SQL,观察控制台发送了几条SQL

 

缓存的底层实现是一个MapMapkey是查询的依据,使用的ORM框架不同,查询依据也不同,Mybatis查询依据为SQLID+SQL语句,hibernate的为查询结果对象的ID

四.增删改对一级缓存的影响

  

   

   

   

五.一级缓存结论

  1. Mybatis框架天然集成一级缓存
  2. 一级缓存查询依据为SQLID+SQL语句
  3. 增删改会清空一级缓存

二级缓存

  一.配置内置二级缓存

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

        

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

        

         

       3.实体实现Serializable(标志接口:没有任何方法)

        

         

       4.测试

        

         

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

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

           

           

      三.关闭刷新缓存(关闭后不再执行SQL查询)

          在增删改对应小配置节点内,加入flushCache值为false

              

              

               

               

    四.查询不应用缓存

        不应用缓存代表会再次发送SQL查询数据

           

           

原文地址:https://www.cnblogs.com/ws1149939228/p/11672429.html