0


MyBatis缓存

1、分页

(1)分页方式
    **分页方式1:**使用Map集合来保存分页需要数据,来进行分页。

    接口代码:

    XML代码: 

    **分页方式2:**使用RowBounds集合来保存分页需要数据,来进行分页。

    接口代码:

    测试代码:

    **分页方式3:**使用分页插件来进行分页。

    导入jar包:

    配置插件:

    调用方法:

     其中第一个数字就是页数,第二个数字就是步长。

    **分页插件说明:**

** ** 测试类代码:

     结果输出:

     这个相当于把查询的语句变成了一段json格式代码。

pageNum当前页的页码pageSize每页显示的条数size当前页的真实条数total总记录页pages总页数prePage上一页的页码nextPage下一页的页码isFirstPage/isLastPage是否为第一页/最后一页hasPreviousPage/hasNextPage导航分页的页码数navigatepageNums导航分页的页码,[1,2,3,4,5]

2、延迟加载和立即加载

(1)立即加载
    立即加载是: 不管用不用信息,只要调用,马上发起查询并进行加载。

    比如: 当我们查询学生信息时,就需要知道学生在哪个班级中,所以就需要立马去查询班级的信息。

    通常:当一对一或者多对一的时候需要立即加载。
(2)延迟加载
    延迟加载是: 在真正使用数据时才发起查询,不用的时候不查询,按需加载(也叫懒加载)。

    比如: 在查询班级信息,每个班级都会有很多的学生(假如每个班有100个学生),如果我们只是查看班级信息,但是学生对象也会加载到内存中,会造成浪费。 所以我门需要进行懒加载,当确实需要查看班级中的学生信息,我门在进行加载班级中的学生信息。

    通常:一对多,或者多对多的是需要使用延迟加载。

    **延迟加载的配置:**

  • 如果设置 lazyLoadingEnabled = false,则禁用延迟加载,会级联加载所有关联对象的数据
  • 如果设置 lazyLoadingEnabled = true,默认情况下mybatis是按层级延时加载的。
  • aggressiveLazyLoading = true,mybatis是按层级延时加载
  • aggressiveLazyLoading = false,mybatis按需求加载。
     **延迟加载的sqlmap:**

    select代码的就是XML对应的一对多或多对多的查找映射器的id名称。

3、一级缓存

(1)什么是缓存

    缓存(cache),数据交换的缓冲区,当应用程序需要读取数据时,先从数据库中将数据取出,放置在缓冲区中,应用程序从缓冲区读取数据。

    特点:数据库取出的数据保存在内存中,具备快速读取和使用。

    限制:读取时无需再从数据库获取,数据可能不是最新的。
(2)缓存的术语
    命中:需要的数据在缓存中找到结果。

    未命中:需要的数据在缓存中未找到,重新获取。
(3)什么是MyBatis缓存
    功能:减少 Java Application 与数据库的交互次数,从而提升程序的运行效率;

    方式:通过配置和定制。
(4)缓存的适用性
  • 适合使用缓存:经常查询并且不经常改变的,数据的正确与否对最终结果影响不大的,比如:一个公司的介绍,新闻等。
  • 不适合用于缓存: 经常改变的数据,数据的正确与否对最终结果影响很大,比如商品的库存,股市的牌价等。
(5)MyBaits缓存分类
    一级缓存:会话 session 级别的缓存,针对一次会话操作内;

    二级缓存:映射器级别的缓存,针对不同 Namespace 的映射器;

    自定义缓存:根据各类不同的缓存机制,自定义缓存的实现方式;
(6)什么是一级缓存

    一级缓存是MyBatis的默认缓存,也称为本地缓存。它是基于SqlSession的缓存,即在同一个SqlSession中执行的多次查询会将查询结果缓存在本地内存中。当同一个SqlSession中执行相同的SQL查询时,MyBatis会首先检查一级缓存,如果缓存中已经存在相同的查询结果,就直接返回缓存中的数据,而不会再次向数据库发出查询请求。

    一级缓存的作用是提高相同查询的响应速度,减少数据库访问次数。在同一个SqlSession中,如果多次执行相同的查询,只有第一次会访问数据库,后续的查询会直接从一级缓存中获取数据,从而降低了数据库的负担。

    sqlSession:默认开启,一级缓存只是相对同一个 SqlSession 对象而言。

    测试代码(如果同时直接获取缓存池中的数据,则打印的是true):

    测试代码(如果清空缓存池中的数据,则对比两个学生对象的地址则为false):

    关闭sqlsession或者情况sqlsession缓存都可以实现第二种测试代码的情况。

    注意:当调用sqlsession的修改,添加,删除,commit(),close() 等方法是, 就会清空一级缓存。
(7)一级缓存的配置

  • localCacheScope:表示配置一级缓存。
  • session:默认是 session 级别的缓存。
  • statement:statement 级别的缓存。
(8) 一级缓存工作流程
    缓存命中的情况下工作流程如下:

    缓存未命中的情况下工作流程如下:

(9)一级缓存失效情况
  • 不同SqlSession对应不同的一级缓存
  • 同一个SqlSession单查询条件不同
  • 同一个SqlSession两次查询期间执行了任何一次增删改操作
  • 同一个SqlSession两次查询期间手动清空了缓存

4、二级缓存

    前言:一级缓存中最大的共享范围就是一个 SqlSession 内部,那么如何让多个 SqlSession 之间也可以共享缓存呢?
(1)什么是二级缓存?
    二级缓存指的就是同一个namespace下的mapper,二级缓存中,也有一个map结构,这个区域就是一级缓存区域。一级缓存中的key是由sql语句、条件、statement等信息组成一个唯一值。一级缓存中的value,就是查询出的结果对象。

    二级缓存的作用是在多个SqlSession之间共享缓存数据,从而提高应用程序的性能。它适用于需要缓存共享的数据,如基础数据表(如国家、城市)等,以减少数据库查询的负担。
(2)二级缓存配置步骤
    配置步骤:

    1、在mybatis的sqlMapConfig.xml中配置

    2、在mybatis的sqlmap中配置(mapper.xml中配置)

    3、在使用的操作中配置(在select标签中配置)

    4、在mapper映射文件中开启二级缓存
<cache eviction="FIFO" flushInterval="60000" size="512" 
readOnly="true"/>
    5、关于eviction的各个参数属性
  • 参数名属性eviction="LRU"最近最少使用的:移除最长时间不被使用的对象。
  • (默认)eviction="FIFO"先进先出:按对象进入缓存的顺序来移除它们。
  • eviction="SOFT"软引用:移除基于垃圾回收器状态和软引用规则的对象。
  • eviction="WEAK"弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。
(3)二级缓存(注解)
    配置步骤:

    1、在mybatis的sqlMapConfig.xml中配置

    2、 在接口的定义上面直接使用@CacheNamespace并将blocking设置为true,二级缓存就可以使用了

(4)二级缓存特点
  • Mybatis的二级缓存相对于一级缓存来说, 实现了缓存数据的共享,可控性也更强;
  • 极大可能会出现错误数据,有设计上的缺陷,安全使用的条件比较苛刻;
  • 分布式环境下,必然会出现读取到错误数据,所以不推荐使用。
(5)一级缓存和二级缓存的区别
  • 一级缓存的作用域是一个sqlsession内;
  • 二级缓存作用域是针对mapper进行缓存;

5、自定义缓存

(1)自定义缓存的分类

标签: mybatis 缓存 spring

本文转载自: https://blog.csdn.net/weixin_71072718/article/details/140893143
版权归原作者 派大星籽 所有, 如有侵权,请联系我们删除。

“MyBatis缓存”的评论:

还没有评论