一级缓存是SqlSession级别的缓存,每个SqlSession都有自己单独的一级缓存,多个SqlSession之间的一级缓存是相互隔离的,互不影响,mybatis中一级缓存是默认自动开启的。
一级缓存也叫本地缓存:
在mybatis中添加日志输出,方便查看测试结果。
//根据id进行查询
User selectUserById(int id);
<select id="selectUserById" resultType="com.sin.pojo.User" parameterType="int">
select * from user where id = #{id}
select>
@Test
public void testCache1() {
SqlSession session = MyBatisUtil.getSession(); //获取SqlSession连接
UserMapper mapper = session.getMapper(UserMapper.class);
User user1 = mapper.selectUserById(1);
User user2 = mapper.selectUserById(1);
System.out.println(user1);
System.out.println(user2);
session.close();
}
@Test
public void testCache2() {
SqlSession session = MyBatisUtil.getSession(); //获取SqlSession连接
SqlSession session2 = MyBatisUtil.getSession(); //获取SqlSession连接
UserMapper mapper = session.getMapper(UserMapper.class);
UserMapper mapper2 = session2.getMapper(UserMapper.class);
User user1 = mapper.selectUserById(1);
System.out.println(user1);
User user2 = mapper2.selectUserById(1);
System.out.println(user2);
session2.close();
session.close();
}
发送了两条sql语句
结论:每条SqlSession中的缓存是不同的
@Test
public void testCache3() {
SqlSession session = MyBatisUtil.getSession(); //获取SqlSession连接
UserMapper mapper = session.getMapper(UserMapper.class);
User user1 = mapper.selectUserById(1);
System.out.println(user1);
User user2 = mapper.selectUserById(2);
System.out.println(user2);
session.close();
}
发送了两条结果,没问题
当前缓存中不存在这条数据
@Test
public void testCache4() {
SqlSession session = MyBatisUtil.getSession(); //获取SqlSession连接
UserMapper mapper = session.getMapper(UserMapper.class);
User user1 = mapper.selectUserById(1);
System.out.println(user1);
HashMap map = new HashMap();
map.put("name","Hello Kitty");
map.put("id",6);
// 更新
mapper.updateUser(map);
User user2 = mapper.selectUserById(2);
System.out.println(user2);
session.close();
}
重复查询中间执行了增删改操作,查询执行了
因为增删改可能会对当前数据产生影响
@Test
public void testCache5() {
SqlSession session = MyBatisUtil.getSession(); //获取SqlSession连接
UserMapper mapper = session.getMapper(UserMapper.class);
User user1 = mapper.selectUserById(1);
System.out.println(user1);
//手动清除缓存
session.clearCache();
User user2 = mapper.selectUserById(2);
System.out.println(user2);
session.close();
}
<settings>
<setting name="cacheEnabled" value="true"/>
settings>
<cache/>
<cache
flushInterval="60000"
size="512"
readOnly="true"/>
可用的清除策略有:
LRU
– 最近最少使用:移除最长时间不被使用的对象。FIFO
– 先进先出:按对象进入缓存的顺序来移除它们。SOFT
– 软引用:基于垃圾回收器状态和软引用规则移除对象。WEAK
– 弱引用:更积极地基于垃圾收集器状态和弱引用规则移除对象。默认的清除策略是 LRU。
public class User implements Serializable{}
@Test
public void testQueryUserById(){
SqlSession session = MyBatisUtil.getSession();
SqlSession session2 = MyBatisUtil.getSession();
UserMapper mapper = session.getMapper(UserMapper.class);
UserMapper mapper2 = session2.getMapper(UserMapper.class);
User user = mapper.selectUserById(1);
System.out.println(user);
session.close();
User user2 = mapper2.selectUserById(1);
System.out.println(user2);
System.out.println(user==user2);
session2.close();
}