Mybatis的一级缓存是sqlsession级别的,通过一个sqlsession查询的数据会被缓存再通过此sqlsession查询的时候,会直接在sqlsession中获取。
一级缓存失效情况
1. 不同的session,对应不同的一级缓存
2. 同一个sqlsession,但是查询条件不同
3. 再同一个sqlsession的两次查询中间,执行了任意一次增删改,(因为增删改会影响数据库里的信息,缓存要求和数据库里的信息一致)
4. 再同一个sqlsession的两次查询中间,清空了缓存
mybatis的二级缓存 ,二级缓存是sqlsessionFactory级别的,通过同一个sqlsessionFactory所获取的sqlsession对象,查询的数据会被缓存, *再通过同一个sqlsessionfactory获取的sqlsession获取数据时,会从缓存中获取数据。
二级缓存开启的条件
1. 从全局配置文件中配置,cacheEnable = true 默认是开启的,不用设置
2. 在mapper文件中设置标签
3. 二级缓存必须在sqlsession关闭或者提交之后才有效
4. 查询的实体类必须要声明序列化接口,
public class Emp implements Serializable{}
否则报错: Cause: org.apache.ibatis.cache.CacheException: Error serializing object. Cause: java.io.NotSerializableException: com.zt.mybatis.pojo.Emp