Mybatis中的缓存及如何开启二级缓存

什么是缓存?

	指存储在内存中的临时数据

为什么使用缓存?

	减少和数据库的交互次数,提高执行效率

什么样的数据适合放到缓存,什么不适合

	## 适合的:
	1.经常查询且不经常改变的
	2.数据的正确与否对最终结果影响不大的
	## 不适合的:
	1.经常改变的数据
	2.数据的正确与否对最终结果影响很大的。如:库存,汇率等

Mybatis中的一级缓存

	 它指的是Mybatis中SqlSession对象的缓存。当我们执行查询后,结果会同时存入到SqlSession中的
	 一块Map结构的区域。当我们再次查询同样的数据时,mybatis会首先去SqlSession中查询是否有记录,
	 若有记录,则直接拿出来返回,当SqlSession对象消失时,则一级缓存也会消失。
**注意:一级缓存实际就是SqlSession的范围,当调用SqlSession的修改,添加,删除,commit(),
close()等方法时就会清空一级缓存**
 @Test
    public void findUserById(){
        User user1 = userDao.findById(41);
        User user2 = userDao.findById(41);
        System.out.println("user1:"+user1);
        System.out.println("user2:"+user2);
        System.out.println(user1==user2);
    }

在这里插入图片描述****查看控制台信息可以看出实际上只进行了一次查询并得到了user1,而user2则是从一级缓存中取得到的**

测试关闭SqlSession对象后,再创建一个新的SqlSession对象:

public void findUserById(){
        User user1 = userDao.findById(41);
        System.out.println("user1:"+user1);
        
       /* sqlSession.close();
        sqlSession=factory.openSession();*/
        
        sqlSession.clearCache();//此方法也可以清空缓存
        userDao=sqlSession.getMapper(IUserDao.class);

        User user2 = userDao.findById(41);
        System.out.println("user2:"+user2);

        System.out.println(user1==user2);
    }

Mybatis中的缓存及如何开启二级缓存_第1张图片查看控制台信息看出分别执行了一次查询获得user1和user2,并且user1和user2并不是同一个对象。

一级缓存的触发清空

测试以下代码,SqlSession执行修改操作。得出SqlSession的一级缓存被清空了,所以就无法从缓存中获取的查询的user对象,只能直接查询

@Test
    public void testClearFirstCache(){
        User user=new User();
        User user1 = userDao.findById(41);
        System.out.println(user1);

        user.setId(41);
        user.setUsername("我被修改了");
        userDao.updateUser(user);

        User user2=userDao.findById(41);
        System.out.println(user2);

    }

Mybatis中的缓存及如何开启二级缓存_第2张图片

**注意:一级缓存实际就是SqlSession的范围,当调用SqlSession的修改,添加,删除,commit(),
close()等方法时就会清空一级缓存**

二级缓存

指的是Mybatis中SqlSessionFactory对象的缓存。由同一个SqlSessionFactory对象创建出的SqlSession对象共享其缓存.
二级缓存使用步骤:
1.在SqlMapConfig中配置

2.在对应的dao层接口的xml文档中添加配置:
在这里插入图片描述

3.然后在需要二级缓存的sql语句的配置中加上:userCache=“true”
在这里插入图片描述执行测试代码:
Mybatis中的缓存及如何开启二级缓存_第3张图片
测试后查看控制台信息:可以看到只执行了一次查询,但是查询返回的是两个不同的对象。因为二级缓存里存的只是数据,而一级缓存存的是对象。
Mybatis中的缓存及如何开启二级缓存_第4张图片

你可能感兴趣的:(Mybatis)