系列六、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);
}
相关推荐
南宫生7 分钟前
力扣-图论-17【算法学习day.67】
java·学习·算法·leetcode·图论
转码的小石15 分钟前
12/21java基础
java
李小白6623 分钟前
Spring MVC(上)
java·spring·mvc
GoodStudyAndDayDayUp36 分钟前
IDEA能够从mapper跳转到xml的插件
xml·java·intellij-idea
Code apprenticeship1 小时前
怎么利用Redis实现延时队列?
数据库·redis·缓存
装不满的克莱因瓶1 小时前
【Redis经典面试题六】Redis的持久化机制是怎样的?
java·数据库·redis·持久化·aof·rdb
n北斗1 小时前
常用类晨考day15
java
骇客野人1 小时前
【JAVA】JAVA接口公共返回体ResponseData封装
java·开发语言
yuanbenshidiaos2 小时前
c++---------数据类型
java·jvm·c++
向宇it2 小时前
【从零开始入门unity游戏开发之——C#篇25】C#面向对象动态多态——virtual、override 和 base 关键字、抽象类和抽象方法
java·开发语言·unity·c#·游戏引擎