MyBatis的一级缓存

在 MyBatis 中,一级缓存是默认开启的。

通过场景来理解:

场景一

1、在一个 SqlSession 中,对 User 表进行两次根据 ID 的查询,查看发出 sql 语句的情况。

/**
 * 根据ID查询用户
 *
 * @param id
 * @return
 */
@Select("select * from user where id=#{id}")
User findUserById(Integer id);

@Before
public void before() throws Exception {
    System.out.println("before...");
    InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
    //根据 sqlSessionFactory 产生 session
    sqlSession = sqlSessionFactory.openSession();
    // 这样也是可以的,这样的话后面就不用每次都设置了
    // sqlSession = sqlSessionFactory.openSession(true);
    userMapper = sqlSession.getMapper(IUserMapper.class);
}

@Test
public void testFindUserById() {
    //第一次查询,发出sql语句,并将查询出来的结果放进缓存中
    User user = userMapper.findUserById(1);
    System.out.println(user);

    //第二次查询,由于是同一个sqlSession,会在缓存中查询结果 //如果有,则直接从缓存中取出来,不和数据库进行交互
    User user2 = userMapper.findUserById(1);
    System.out.println(user2);
}

Terwer...大约 5 分钟MyBatis后端开发开源框架查询缓存mybatis一级缓存
MyBatis缓存的概念

缓存回顾

缓存就是内存中的数据,常常来自对数据库查询结果的保存。

使用缓存可以避免频繁与数据库交互,进而提高响应速度。

MyBatis 对缓存的支持

MyBatis 也提供了对缓存的支持,分为 一级缓存二级缓存。可以用下面的图来理解:

  1. 一级缓存是 SqlSession 级别的缓存。在操作数据库时,需要构造 SqlSession 对象,在对象中有一个 HashMap 的数据结构用于存储缓存数据。不同的 SqlSession 之间缓存的数据区域(HashMap)是不同的。
  2. 二级缓存是 Mapper 级别的缓存。多个 SqlSession 操作同一个 Mapper 的 sql 语句,多个 SqlSession 可以共用二级缓存,二级缓存是跨 SqlSession 的。

Terwer...大约 1 分钟MyBatis后端开发开源框架缓存二级缓存数据库数据mybatis一级缓存