缓存的作用域
MyBatis框架提供了俩级缓存,一级缓存和二级缓存。**默认开启的是一级缓存**
缓存就是为了提交查询效率
使用缓存后查询流程: 查询先缓存到缓存里查,如果没有则查询数据库,放缓存一份,再返回客户端。下次再查询的时候直接从数据库发生commit()操作,则清空缓存。
一级缓存使用的是**sqlSession**的作用域,同一个**sqlSession**共享一级缓存的数据。
二级缓存使用的是**mapper作用域**,不同的**sqlSession**只要**访问的同一个mapper.xml**,则共享二级缓存作用域
验证
SqlSession sqlSession;UsersMapper uMapper;@Beforepublic void test01(){InputStream in = Resources.getReourceAsStream("mybatis");SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);sqlSession = factory.openSession();uMapper = sqlSession.getMapper(UsersMapper.class);}@Testpublic void test02(){//第一次取id=5的用户Users u1 = uMapper.getById(5);System.out.println("第一次读取用户的u:" + u1);System.out.println("********************");Users u2 = uMapper.getById(5);System.out.println("第一次读取用户的u:" + u2);System.out.println(u1==u2);//它们都是在同一个sqlSeesion中开的内存空间,如果它们地址是一样的,那就是说明它们是同一个对象}@Afterpublic void test03(){sqlSeesion.close();}
二级缓存
不管你知不知道缓存,MyBatis框架都在给你做一级缓存的处理。
1.如果是二级缓存,就比较麻烦;需要在核心配置文件(mybatis.xml)中
<settings><setting name="logImpl" value="STDOUT_LOGGING" /><!--开启二级缓存--><setting name="cacheEnable" value="true" /></settings>
2.你访问哪个Mapper,你就要在哪个Mapper中添加<cache></cache>标签
<mapper namespace="...UsersMapper">
<cache></cache>
</mapper>
3.还要将实现类必须实现java.io.serializable接口,保证实例可序列化
public class Users implements Serializable{
private int id;
....
}
