Mybatis缓存

本文介绍了MyBatis中的一级缓存和二级缓存的工作原理及使用注意事项。一级缓存作用于同一个SqlSession内,而二级缓存则在所有SqlSession间共享。通过示例代码展示了如何利用缓存提高查询效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Mybatis的缓存分为一级缓存、二级缓存

一级缓存范围只在controller里,并且需要同一个sqlsession才会影响缓存内容

二级缓存范围在项目里所有的controller中都有效

一级缓存

/**

* 一级缓存 相同的SqlSession

*/

@Test

public void testCacheOneSameSession() {

SqlSession sqlSession = MybatisUtils.getSqlSession();

try {

SysUserMapper sysUserMapper = sqlSession.getMapper(SysUserMapper.class);

System.out.println("第一次查询:");

List<SysUser> userList1 = sysUserMapper.selectByCondition("admin");

for (SysUser user : userList1) {

System.out.println(user);

}

System.out.println("第二次查询:");

List<SysUser> userList2 = sysUserMapper.selectByCondition("admin");

for (SysUser user : userList2) {

System.out.println(user);在日志和输出中:

第一次查询发送了 SQL 语句, 后返回了结果;

第二次查询没有发送 SQL 语句, 直接从缓存中获取了结果。

第一次的对象和第二次的对象是相同的。

//判断是相同

System.out.println("userList1 == userList2 "+(userList1 == userList2 ));

} finally {

sqlSession1.close();

sqlSession2.close();

}

}

 

 清空缓存

/**

* 一级缓存 清空缓存(Java代码)

*/

@Test

public void testCacheOneCleanCacheJavaCode() {

SqlSession sqlSession = MybatisUtils.getSqlSession();

try {

SysUserMapper sysUserMapper = sqlSession.getMapper(SysUserMapper.class);

System.out.println("第一次查询:");

List<SysUser> userList1 = sysUserMapper.selectByCondition("admin");

for (SysUser user : userList1) {

System.out.println(user);

}

//清空缓存

System.out.println("清空缓存");

sqlSession.clearCache();

System.out.println("第二次查询:");

List<SysUser> userList2 = sysUserMapper.selectByCondition("admin");两次都发送了 SQL 语句, 同时两个对象不相同。

9.1.3.2Mapper.xml配置方式

SysUserMapper.xmlselectByCondition方法上添加 flushCache="true" 属性

for (SysUser user : userList2) {

System.out.println(user);

}

//判断是相同

System.out.println("userList1 == userList2 "+(userList1 == userList2 ));

} finally {

sqlSession.close();

}

}

 

二级缓存

/**

* 二级缓存 不同的SqlSession

*/

@Test

public void testCacheTwoDifferentSession() {

SqlSession sqlSession1 = MybatisUtils.getSqlSession();

SysUserMapper sysUserMapper = sqlSession1.getMapper(SysUserMapper.class);

System.out.println("sqlSession1查询:");

List<SysUser> userList1 = sysUserMapper.selectByCondition("admin");9.3、缓存使用注意事项

1. 由于在更新时会刷新缓存, 因此需要注意使用场合:查询频率很高, 更新频率很低时使用, 即经

常使用 select, 相对较少使用insert, updatedelete

2. 缓存是以 namespace 为单位的,不同 namespace 下的操作互不影响。但刷新缓存是刷新整个

namespace 的缓存, 也就是你 insert, updatedelete 了一个, 则整个缓存都刷新了。

3. 最好在 「只有单表操作」 的表的 namespace 使用缓存, 而且对该表的操作都在这个

namespace 中。 否则可能会出现数据不一致的情况。

for (SysUser user : userList1) {

System.out.println(user);

}

sqlSession1.close();

SqlSession sqlSession2 = MybatisUtils.getSqlSession();

SysUserMapper sysUserMapper2 = sqlSession2.getMapper(SysUserMapper.class);

System.out.println("sqlSession2查询:");

List<SysUser> userList2 = sysUserMapper2.selectByCondition("admin");

for (SysUser user : userList2) {

System.out.println(user);

}

sqlSession2.close();

//判断是否相同

System.out.println("userList1 == userList2 "+(userList1 == userList2 ));

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值