一级缓存
SqlSession (Map.key+要查询的sql Id+查询的sql语句)
默认开启
范例:一级缓存
接口
//查询指定用户id的用户信息
public User getUserByUserId(@Param("uid") Integer id);
映射
<select id="getUserByUserId" parameterType="Integer" resultType="User">
select * from smbms_user u where u.id=#{uid}
</select>
测试相同sqlSession
@Test
public void test13(){ //相同sqlSession
SqlSession sqlSession = SqlSessionUtil.creatSqlSession();
UserMapper um=sqlSession.getMapper(UserMapper.class);
//第一次查询
User user1=um.getUserByUserId(1);
System.out.println("第一次查询到的用户信息:"+user1.getUserName());
//第二次查询
User user2=um.getUserByUserId(1);
System.out.println("第二次查询到的用户信息:"+user2.getUserName());
// 关闭sqlSession
SqlSessionUtil.closSqleSession(sqlSession);
}
执行结果
测试不同sqlSession
@Test
public void test14(){ //不同sqlSession
SqlSession sqlSession = SqlSessionUtil.creatSqlSession();
SqlSession sqlSession1 = SqlSessionUtil.creatSqlSession();
UserMapper um1=sqlSession.getMapper(UserMapper.class);
UserMapper um2=sqlSession1.getMapper(UserMapper.class);
//第一次查询
User user1=um1.getUserByUserId(1);
System.out.println("第一次查询到的用户信息:"+user1.getUserName());
//第二次查询
User user2=um2.getUserByUserId(1);
System.out.println("第二次查询到的用户信息:"+user2.getUserName());
// 关闭sqlSession
SqlSessionUtil.closSqleSession(sqlSession);
}
执行结果
结论
相同sqlSession访问同一数据的时候:显然一级缓存起作用
不同sqlSession访问同一数据的时候:不起作用了
一级缓存失效的情况
- 不同的sqlSession
- 相同的sqlSession,期间进行了增删改查
- 相同的sqlSession,手动删除了缓存:sqlSession.clearCache();
二级缓存
针对命名空间级别(namespace)
sqlSession必须关闭或者提交,二级缓存才起作用
二级缓存编程步骤
- 首先在mybatis核心配置文件,开启二级缓存
<!-- 开启二级缓存 -->
<setting name="cacheEnabled" value="true"/>
- 在要使用二级缓存的映射文件里进行缓存的相关配置
<!-- 配置二级缓存 -->
<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true" />
移除策略:
LRU – 最近最少使用:移除最长时间不被使用的对象。默认
FIFO – 先进先出:按对象进入缓存的顺序来移除它们。
SOFT – 软引用:基于垃圾回收器状态和软引用规则移除对象。
WEAK – 弱引用:更积极地基于垃圾收集器状态和弱引用规则移除对象。
flushInterval(刷新间隔)
size(缓存保存的个数)
readOnly(只读)默认false
- 相关实体类必须实现序列化接口
public class User implements Serializable{}
- 二级缓存映射文件相关使用配置属性
使用缓存:useCache=“true”
刷新缓存:flushCache=“true”
<select id="getUserList" resultType="User" useCache="true" flushCache="true">
select * from smbms_user
</select>
范例:测试二级缓存是否启用
@Test
public void test17(){
SqlSession sqlSession = SqlSessionUtil.creatSqlSession();
SqlSession sqlSession1 = SqlSessionUtil.creatSqlSession();
UserMapper um1=sqlSession.getMapper(UserMapper.class);
UserMapper um2=sqlSession1.getMapper(UserMapper.class);
User user1=um1.getUserByUserId(1);
System.out.println(user1.getUserName());
sqlSession.commit();
User user2=um2.getUserByUserId(1);
System.out.println(user2.getUserName());
// 关闭sqlSession
SqlSessionUtil.closSqleSession(sqlSession);
}
mybatis允许对缓存进行自定义