系列六、Mybatis的一级缓存

一、概述

Mybatis一级缓存的作用域是同一个SqlSession,在同一个SqlSession中执行两次相同的查询,第一次执行完毕后,Mybatis会将查询到的数据缓存起来(缓存到内存中), 第二次执行相同的查询时,会从缓存中取数据,不再进行数据库的查询,从而提高查询效率。默认情况下,Mybatis开启了一级换粗。

二、一级缓存(生效)案例演示

2.1、 CacheTest

java 复制代码
@Test
public void test1() {
	UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
	UserDO u1 = userMapper.getUserById(1);
	System.out.println("u1 = " + u1);
	System.out.println("===============");
	UserDO u2 = userMapper.getUserById(1);
	System.out.println("u2 = " + u2);
}

三、一级缓存(失效)案例(原因)演示

3.1、两次查询使用的不是同一个sqlSession

java 复制代码
/**
 * mybatis的一级缓存失效的第一种原因:两次查询使用的不是同一个sqlSession
 */
private static void m1() {
	SqlSession sqlSession1 = SqlSessionFactoryUtil.getInstance().openSession();
	SqlSession sqlSession2 = SqlSessionFactoryUtil.getInstance().openSession();
	UserMapper userMapper1 = sqlSession1.getMapper(UserMapper.class);
	UserMapper userMapper2 = sqlSession2.getMapper(UserMapper.class);

	UserDO u1 = userMapper1.getUserById(1);
	System.out.println(u1);

	System.out.println("=================");

	UserDO u2 = userMapper2.getUserById(1);
	System.out.println(u2);
}

3.2、两次查询之间有增删改的操作

java 复制代码
/**
 * mybatis的一级缓存失效的第二种原因:两次查询之间有增删改的操作
 */
private void m12() {
	UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

	UserDO u1 = userMapper.getUserById(1);
	System.out.println(u1);

	int result = userMapper.delUserById(2);
	System.out.println("result = " + result);

	UserDO u2 = userMapper.getUserById(1);
	System.out.println(u2);
}

3.3、两次查询的查询条件不一样

java 复制代码
/**
 * mybatis的一级缓存失效的第三种原因:两次查询的查询条件不一样
 */
private void m13() {
	UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

	UserDO u1 = userMapper.getUserById(1);
	System.out.println(u1);

	UserDO u2 = userMapper.getUserById(2);
	System.out.println(u2);
}
相关推荐
慕木沐4 分钟前
Google ADK Java 1.0版本 核心机制与实战 Demo
java·开发语言·python
焦虑的说说1 小时前
秒杀系统设计方案
java
许彰午1 小时前
30_Java Stream流操作全解
java·windows·python
qq_2518364571 小时前
基于java Web网络订餐系统设计与实现 源码文档
java·开发语言·前端
小小工匠1 小时前
Redis 缓存替换策略:8 种淘汰策略与 LRU 实现剖析
数据库·redis·缓存
存在的五月雨2 小时前
MyBatis 中,#{} 和 ${}的区别
mybatis
凡人叶枫2 小时前
Effective C++ 条款17:以独立语句将 newed 对象置入智能指针
java·linux·开发语言·c++·算法
飞天狗1112 小时前
零基础JavaWeb入门——第2课:让网页“活”起来 —— JSP是什么?
java·开发语言·前端·后端·web
梦@_@境2 小时前
面向 Spring Boot 的可观测业务流程编排引擎
java·spring boot·后端
云烟成雨TD3 小时前
Spring AI Alibaba 1.x 系列【77】执行取消
java·人工智能·spring