缓存的作用域

MyBatis框架提供了俩级缓存,一级缓存和二级缓存。**默认开启的是一级缓存**

缓存就是为了提交查询效率

使用缓存后查询流程: 查询先缓存到缓存里查,如果没有则查询数据库,放缓存一份,再返回客户端。下次再查询的时候直接从数据库发生commit()操作,则清空缓存。

一级缓存使用的是**sqlSession**的作用域,同一个**sqlSession**共享一级缓存的数据。

二级缓存使用的是**mapper作用域**,不同的**sqlSession**只要**访问的同一个mapper.xml**,则共享二级缓存作用域

验证
  1. SqlSession sqlSession;
  2. UsersMapper uMapper;
  3. @Before
  4. public void test01(){
  5. InputStream in = Resources.getReourceAsStream("mybatis");
  6. SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
  7. sqlSession = factory.openSession();
  8. uMapper = sqlSession.getMapper(UsersMapper.class);
  9. }
  10. @Test
  11. public void test02(){
  12. //第一次取id=5的用户
  13. Users u1 = uMapper.getById(5);
  14. System.out.println("第一次读取用户的u:" + u1);
  15. System.out.println("********************");
  16. Users u2 = uMapper.getById(5);
  17. System.out.println("第一次读取用户的u:" + u2);
  18. System.out.println(u1==u2);//它们都是在同一个sqlSeesion中开的内存空间,如果它们地址是一样的,那就是说明它们是同一个对象
  19. }
  20. @After
  21. public void test03(){
  22. sqlSeesion.close();
  23. }

二级缓存

不管你知不知道缓存MyBatis框架都在给你做一级缓存的处理

1.如果是二级缓存,就比较麻烦;需要在核心配置文件(mybatis.xml)中

  1. <settings>
  2. <setting name="logImpl" value="STDOUT_LOGGING" />
  3. <!--开启二级缓存-->
  4. <setting name="cacheEnable" value="true" />
  5. </settings>

2.你访问哪个Mapper,你就要在哪个Mapper中添加<cache></cache>标签

<mapper namespace="...UsersMapper">
    <cache></cache>
</mapper>

3.还要将实现类必须实现java.io.serializable接口,保证实例可序列化

public class Users implements Serializable{
    private int id;
    ....
}