Mybatis的一级缓存
创始人
2024-02-02 12:14:19
0

目录

  • 前置
  • 生效
    • 场景一
    • 场景二
  • 失效
    • 场景一
    • 场景二
    • 场景三
    • 场景四
    • 场景五


前置

什么是一级缓存: mybatis 默认开启一级缓存, SQLSession会话缓存, 每个SQLSession都会有各自的缓存
以下会演示一级缓存生效/失效的场景
项目地址: https://gitee.com/xmaxm/test-code/blob/master/chaim-cache/chaim-mybatis-cache/chaim-mybatis-cache-one/README.md

相关缓存文章

Mybatis的一级缓存
Mybatis的二级缓存 (默认方式)
Mybatis的二级缓存 (Redis方式)
Mybatis的二级缓存 (ehcache方式)


生效


场景一

测试一级缓存生效, 默认开启, 需要保证在同一个 SqlSession (可使用 @Transactional 保持其同一个会话)
使用mybatis plus方法

@Transactional
public void queryingLevelCache() {LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();queryWrapper.select(SysUser::getUsername, SysUser::getPhone, SysUser::getId);queryWrapper.last("limit 1");SysUser sysUsers = sysUserMapper.selectOne(queryWrapper);log.info("查询成功, 观察日志, id: {}", sysUsers.getId());SysUser user = sysUserMapper.selectOne(queryWrapper);log.info("查询成功, 观察日志, id: {}", user.getId());
}

在这里插入图片描述


场景二

测试一级缓存生效, 默认开启, 需要保证在同一个 SqlSession (可使用 @Transactional 保持其同一个会话)
使用自定义SQL

    @Transactionalpublic void queryingLevelCache(Integer integer) {SysUser sysUsers = sysUserMapper.selectHandwritingSql();log.info("查询成功, 观察日志, id: {}", sysUsers.getId());SysUser user = sysUserMapper.selectHandwritingSql();log.info("查询成功, 观察日志, id: {}", user.getId());}

在这里插入图片描述


失效


场景一

测试一级缓存失效: 当两次查询存在之间, 存在增删改的情况

public void queryingLevelCacheFail() {LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();queryWrapper.select(SysUser::getUsername, SysUser::getPhone, SysUser::getId);queryWrapper.last("limit 1");SysUser sysUsers = sysUserMapper.selectOne(queryWrapper);log.info("查询成功, 观察日志, id: {}", sysUsers.getId());SysUser sysUser = SysUser.builder().username("潇潇").email("gmail.com").phone("000123").password("123456").sex(1).state(0).salt(1234).build();sysUserMapper.insert(sysUser);log.info("观察新增日志, id: {}", sysUsers.getPassword());SysUser user = sysUserMapper.selectOne(queryWrapper);log.info("查询成功, 观察日志, id: {}", user.getId());}

在这里插入图片描述


场景二

测试一级缓存失效: 当两次查询的方式不一样, 使用mybatis的方法, 以及自定义SQL
同理, 当查询的条件以及查询的内容不一致时也会失效

 public void queryingLevelCacheFail(Integer integer) {LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();queryWrapper.select(SysUser::getUsername, SysUser::getPhone);queryWrapper.last("limit 1");SysUser sysUsers = sysUserMapper.selectOne(queryWrapper);log.info("查询成功, 观察日志, id: {}", sysUsers.getId());SysUser user = sysUserMapper.selectHandwritingSql();log.info("查询成功, 观察日志, id: {}", user.getId());}

在这里插入图片描述


场景三

测试一级缓存失效: 手动清除缓存

@Override
public void queryingLevelCacheFail(String string) {SysUser sysUsers = sysUserMapper.selectHandwritingSql();log.info("查询成功, 观察日志, id: {}", sysUsers.getId());sqlSession.clearCache();SysUser user = sysUserMapper.selectHandwritingSql();log.info("查询成功, 观察日志, id: {}", user.getId());
}

在这里插入图片描述


场景四

测试一级缓存失效: 去除@Transactional, 使其不在同一个 SqlSession

@Override
public void queryingLevelCacheFail(Boolean blo) {SysUser sysUsers = sysUserMapper.selectHandwritingSql();log.info("查询成功, 观察日志, id: {}", sysUsers.getId());SysUser user = sysUserMapper.selectHandwritingSql();log.info("查询成功, 观察日志, id: {}", user.getId());
}

在这里插入图片描述


场景五

测试一级缓存失效:
xml配置: flushCache=“true”
注解方式SQL配置: @Options(flushCache = Options.FlushCachePolicy.TRUE)
同理还可以全局配置: 禁用mybatis一级缓存: mybatis-plus.configuration.local-cache-scope: statement. 默认开始 session

@Override
public void queryingLevelCacheFail(Long lon) {SysUser sysUsers = sysUserMapper.selectHandwritingSqlFail();log.info("查询成功, 观察日志, id: {}", sysUsers.getId());SysUser user = sysUserMapper.selectHandwritingSqlFail();log.info("查询成功, 观察日志, id: {}", user.getId());log.info("-----------自义定SQL的两种失效方式-----------------");sysUsers = sysUserMapper.selectHandwritingSqlFail2();log.info("查询成功, 观察日志, id: {}", sysUsers.getId());user = sysUserMapper.selectHandwritingSqlFail2();log.info("查询成功, 观察日志, id: {}", user.getId());
}

@Options(flushCache = Options.FlushCachePolicy.TRUE)
@Select("SELECT username,phone,id FROM sys_user limit 1")
SysUser selectHandwritingSqlFail2();

在这里插入图片描述
在这里插入图片描述

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...