Mybatis MyBatis框架的缓存 一级缓存
1. 缓存的概念
-
缓存的概念
- 在内存中临时存储数据,速度快,可以减少数据库的访问次数。
- 经常需要查询,不经常修改的数据,不是特别重要的数据都适合于存储到缓存中。
2.Mybatis缓存
- mybatis包含了一个非常强大的查询缓存特性,他可以非常方便的定制和配置缓存。缓存可以极大的提高查询的效率
- mybatis系统当中默认定义了两级缓存:一级缓存和二级缓存
- 默认情况之下,只有一级缓存开启(sqlSession级别的缓存)
- 二级缓存需要手动开启配置,需要局域namespace级别的缓存。
1.一级缓存(也叫本地缓存)
-
MyBatis的一级缓存也是SqlSession的缓存。
-
SqlSession对象中维护了一个Map集合,用于存储相互的缓存数据。
-
查询的时候,先从SqlSession的缓存中查找,如果有,直接返回。如果没有,查询数据库。
-
证明一级缓存的存在,通过用户id查询2次,查看结果。
public class UserTest { private InputStream in = null; private SqlSession session = null; private UserDao mapper = null; /** * 测试查询所有的方法 */ @Test public void findById() throws IOException { //加载主配置文件,目的是为了构建SqlSessionFactory对象 in = Resources.getResourceAsStream("SqlMapConfig.xml"); //创建SqlSessionFactory对象 SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in); //通过SqlSessionFactory工厂对象创建SqlSesssion对象 session = factory.openSession(); //通过Session创建UserDao接口代理对象 mapper = session.getMapper(UserDao.class); User user1 = mapper.findById(1); System.out.println(user1.toString()); System.out.println("-----------------"); User user2 = mapper.findById(1); System.out.println(user2.toString()); System.out.println(user1 == user2); //释放资源 session.close(); in.close(); } }
缓存失效的情况:
- sqlSession不同
- sqlSession相同,查询条件不同
- sqlSession相同,两次查询之间执行了增删改操作
- sqlSession相同,手动清除一级缓存