简要说明:
1、Mybatis缓存分为一级缓存和二级缓存。在没有配置的情况下,默认开启一级缓存,不开启二级缓存。
2、如果配置开启二级缓存,会先查询二级缓存,没有的话再查询一级缓存。(原理)
(如果是springboot项目,默认mybatis.configuration.cache-enabled的值是true,也就是默认开启Mybatis的二级缓存的,但也需要相应的配置才能使用二级缓存)
一级缓存(同一个SqlSession)
一级缓存具有和sqlsession一样的生命周期,SqlSession相当于一个JDBC的Connection对象,在一次请求事务会话后,我们将其关闭。
import com.boot.mybatis.dao.UserMapper;
import com.boot.mybatis.po.User;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotEquals;
/**
* @author river
* 2020/2/11
*/
@SpringBootTest
class MybatisCacheTest {
@Autowired
SqlSessionFactory sqlSessionFactory;
@Test
void theSameSqlSession() {
try (SqlSession sqlSession = sqlSessionFactory.openSession()) {//在try()中的资源会自动释放
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//查询结果会缓存起来,如果不希望缓存这个查询结果,可以在<select>中加上flushCache="true",或者任何的update, insert, delete语句都会清空此缓存。
User user1 = userMapper.selectByPrimaryKey(1);
//下面不会查询数据库,第一次查询的结果缓存在sqlSession一级缓存中
User user2 = userMapper.selectByPrimaryKey(1);
assertEquals(user1, user2);//同一个User对象,地址相同
}
}
@Test
void notTheSameSqlSession(){
SqlSession sqlSession2 = null;
try (SqlSession sqlSession1 = sqlSessionFactory.openSession()) {
UserMapper userMapper1 = sqlSession1.getMapper(UserMapper.class);
//查询结果会缓存到sqlSession1中
User user1 = userMapper1.selectByPrimaryKey(1);
sqlSession1.commit();//一定要提交,不然不会进入二级缓存
sqlSession2 = sqlSessionFactory.openSession();
UserMapper userMapper2 = sqlSession2.getMapper(UserMapper.class);
//sqlSession2中没有缓存此查询,所以会查询数据库(没有配置