MyBatis缓存

目录

1、分页

(1)分页方式

2、延迟加载和立即加载

(1)立即加载

(2)延迟加载

3、一级缓存

(1)什么是缓存

(2)缓存的术语

(3)什么是MyBatis缓存

(4)缓存的适用性

(5)MyBaits缓存分类

(6)什么是一级缓存

(7)一级缓存的配置

(8) 一级缓存工作流程

(9)一级缓存失效情况

4、二级缓存

(1)什么是二级缓存?

(2)二级缓存配置步骤

(3)二级缓存(注解)

(4)二级缓存特点

(5)一级缓存和二级缓存的区别 

5、自定义缓存

(1)自定义缓存的分类


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)自定义缓存的分类

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值