MyBatis一级缓存
MyBatis的一级缓存是SqlSession级别的,即通过同一个SqlSession查询的会被缓存 在次使用同一个SqlSession查询同一条数据会被缓存获取 使一级缓存失效的四种情况 1. 不同的SqlSession对应不同的一级缓存 2.同一个SqlSession但是查询条件不同 例如一个查id为1 一个查id为2 3.同一个SqlSession两次查询期间进行了增删改操作(执行增删改操作会更新数据库) 4.同一个SqlSession两次查询期间手动清楚缓存
//一级缓存
Emp findOneById(@Param("emp_id") Integer emp_id);
//通过增删改使得一级缓存失效
void addOne(Emp emp);
<!-- Emp findOneById(@Param("emp_id") Integer emp_id);-->
<select id="findOneById" resultType="Emp">
select * from emp where emp_id=#{emp_id}
</select>
<!-- void addOne(Emp emp);-->
<insert id="addOne">
insert into emp values (null,#{emp_name},#{age},#{gender},null)
</insert>
@Test
public void testOne(){
SqlSession sqlSession = ssf.openSession(true);
EmpDao mapper = sqlSession.getMapper(EmpDao.class);
Emp emp = mapper.findOneById(1);
System.out.println(emp);
//在两次查询中执行增删改中的一个缓存失效
// mapper.addOne(new Emp(null,"ccc",20,"男"));
sqlSession.clearCache();
Emp emp1 = mapper.findOneById(1);
System.out.println(emp1);
SqlSession sqlSession1 = ssf.openSession(true);
EmpDao mapper1 = sqlSession1.getMapper(EmpDao.class);
Emp emp3 = mapper1.findOneById(1);
System.out.println(emp3);
}
MyBatis二级缓存
MyBatis的二级缓存 MyBatis的二级缓存是SqlSessionFactory级别的,即同一个SqlSessionFactory所获取的sqlSession对象 查询的数据会被缓存,在通过同一个SqlSessionFactory所获取的sqlSession查询相同的数据会从缓存中获取
@Test
public void testTwo() throws IOException {
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(is);
SqlSession sqlSession= ssf.openSession(true);
EmpDao mapper = sqlSession.getMapper(EmpDao.class);
Emp emp = mapper.findOneById(1);
System.out.println(emp);
//sqlSession关闭
sqlSession.close();
SqlSession sqlSession1= ssf.openSession(true);
EmpDao mapper1 = sqlSession1.getMapper(EmpDao.class);
Emp emp1 = mapper1.findOneById(1);
System.out.println(emp1);
sqlSession.close();
}