首先从它们的区别讲起,使用方面主要从spring boot的角度进行讲解。
我的mybatis版本如下:
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
作用域的区别:
一级缓存:同一sqlSession内有效。什么是同一sqlSession内,比如一个方法中调用两遍一样的查询,那么第二遍查询则会使用缓存。
二级缓存:同一namespace内有效。什么是同一namespace内,比如有一个User的实体类,针对该实体有一个UserMapper接口类及UserMapper.xml文件。那么该UserMapper.xml中的所有数据库操作视为同一namespace内。
spring boot中的使用区别:
一级缓存:我的版本为默认已经开启了一级缓存,但是必须开启事务的情况下才会生效。spring boot中开启事务需要在主启动类加上 @EnableTransactionManagement 注解,在service实现类加上 @Transactional 注解。
二级缓存:一、在properties或yml配置文件中添加如下配置。true表示开启mybatis二级缓存。
mybatis.configuration.cache-enabled=true
二、在mapper.xml文件中添加<cache />。
三、实体类需要实现序列化接口Serializable
缓存刷新机制的区别:
一级缓存:除了增删改操作会清空之外,当sqlSession结束之后一级缓存也会被清空。也就是说如果一个方法只使用了查询,但你每次访问都是一个新的sqlSession,这个时候是不会触发缓存命中的。
二级缓存:增删改操作会清空,可以通过在mapper.xml文件上配置属性来控制是否使用和是否触发清空缓存。flushCache:是否触发清空缓存;useCache:是否使用缓存。
<insert id="insert" parameterType="***" flushCache="false">
这样该insert操作将不会触发二级缓存清空。