一级缓存也叫作SqlSession缓存,为每个SqlSession对象单独分配的缓存内存,无需开启可直接使用;多个SqlSession的缓存是不共享的。
特性:
1.如果多次查询使用的是同一个SqlSession对象,则第一次查询之后数据会存放到缓存,后续的查询则直接访问缓存中存储的数据
2.如果第一次查询完成之后,对查询出的对象进行修改(此修改会影响到缓存,但不会影响数据库),第二次查询会直接访问缓存,造成第二次查询的结果与数据库不一致
3.当我们进行在查询时想要跳过缓存直接查询数据库,则可以通过sqlSession.clearCache();来清除当前SqlSession的缓存
4.如果第一次查询之后,第二次查询之前,使用SqlSe
ssion执行了修改操作,此修改操作会使第一次查询并缓存的数据失效,因此第二次查询会再次访问数据库
@Test
public void testMybaitsCache(){
SqlSession sqlSession1 = MyBatisUtil.getSqlSession();
CustDao custDao = sqlSession1.getMapper(CustDao.class);
CustVo custVo = custDao.queryCustById(1);
System.out.println(custVo.getCustCode());//结果为20
custVo.setCustCode(100);
CustDao custDao1 = sqlSession1.getMapper(CustDao.class);
CustVo custVo1 = custDao1.queryCustById(1);
System.out.println(custVo1.getCustCode());//结果为100
}
上述代码只会执行一条sql语句,第二次查询会从mybatis中获取数据。
因为,custVo在从数据库查询到id为1的数据后,将其放入缓存中,之后custVo便指向了这块内存地址。
之后对custVo中的内容进行修改,实际上是对custVo所指向的地址中的内容进行修改,也就是对缓存中存放的数据进行修改。所以第二次查询,仍然没有查数据库,因为我有id=1的缓存信息,且查出来后客户编码是100。
同时可以去数据库中查看一下,数据库中id为1的记录,其客户编码仍然为20,因为修改时修改的是缓存。