转载:https://www.cnblogs.com/ysocean/p/7342498.html
mybatis 为我们提供了一级缓存和二级缓存,可以通过下图来理解:
①、一级缓存是SqlSession级别的缓存。在操作数据库时需要构造sqlSession对象,在对象中有一个数据结构(HashMap)用于存储缓存数据。不同的sqlSession之间的缓存数据区域(HashMap)是互相不影响的。
②、二级缓存是mapper级别的缓存,多个SqlSession去操作同一个Mapper的sql语句,多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的。
1、一级缓存
①、我们在一个 sqlSession 中,对 User 表根据id进行两次查询,查看他们发出sql语句的情况。
@Test public void testSelectOrderAndUserByOrderId(){ //根据 sqlSessionFactory 产生 session SqlSession sqlSession = sessionFactory.openSession(); String statement = "one.to.one.mapper.OrdersMapper.selectOrderAndUserByOrderID"; UserMapper userMapper = sqlSession.getMapper(UserMapper.class); //第一次查询,发出sql语句,并将查询的结果放入缓存中 User u1 = userMapper.selectUserByUserId(1); System.out.println(u1); //第二次查询,由于是同一个sqlSession,会在缓存中查找查询结果 //如果有,则直接从缓存中取出来,不和数据库进行交互 User u2 = userMapper.selectUserByUserId(1); System.out.println(u2); sqlSession.close(); }