在 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);
}
...大约 5 分钟