Mybatis缓存

mybatis缓存

1.缓存介绍

缓存是一种临时存储少量数据至内存或者是磁盘的一种技术.减少数据的加载次数,可以降低工作量,提高程序响应速度缓存的重要性是不言而喻的。

MyBatis的缓存将相同查询条件的SQL语句执行一遍后所得到的结果存在内存或者某种缓存介质当中,当下次遇到一模一样的查询SQL时候不在执行SQL与数据库交互,而是直接从缓存中获取结果,不再查询数据库,提升了性能;尤其是在查询越多、缓存命中率越高的情况下,使用缓存对性能的提高更明显。

MyBatis分为一级缓存和二级缓存,同时也可配置关于缓存设置。一级存储是SqlSession上的缓存,二级缓存是在SqlSessionFactory(namespace)上的缓存。默认情况下,MyBatis开启一级缓存,没有开启二级缓存。当数据量大的时候可以借助一些第三方缓存框架或Redis缓存来协助保存Mybatis的二级缓存数据。

2.一级缓存

一级缓存是SqlSession级缓存。只要是同一个SqlSession对象(必须是同一个)调用同一个<select>标签相同参数值时(不同<select>完全相同的SQL不会走同一个缓存),将直接使用缓存数据,而不会访问数据库。

重要提示:

​ 一级缓存想要生效,必须同时满足3个条件:

  1. 同一个SqlSession对象。
  2. 同一个select标签。本质为底层同一个JDBC的Statemen对象
  3. 完全相同的SQL,包含SQL的参数值也必须相同

insert、delete、update操作会清空一级缓存数据。

commit也会清空缓存。

2.1 一级缓存流程图

命中缓存:从Map中查询是否存在指定key。如果存在表示命中缓存,如果不存在这个key,需要访问数据库。

更新到缓存:把查询结果put到map中。

在这里插入图片描述

2.2 代码演示

以DeptMapper接口的selectById(int id)方法进行演示。目前selectById在映射文件的配置是

    <resultMap id="deptMap2" type="Dept">
        <id column="d_id" property="id"></id>
        <result column="d_name" property="name"></result>
    </resultMap>
    <select id="selectById" resultMap="deptMap2">
        select * from dept where d_id=#{id}
    </select>
2.2.1 同一个SqlSession下测试一级缓存

在测试类中测试同一个SqlSession对于相同参数和不同参数是否命中缓存

public class Test {
   
    public static void main(String
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值