mybatis 缓存 分为一级缓存和二级缓存
- 一级缓存为sqlSession,缓存内容只在sqlSession内有效
- 二级缓存为mapper级别的缓存
一级缓存
- 在操作数据库时,会首先创建sqlSession会话对象,sql对象中会有一个私有的hashMap对象来储存数据,hashMap以(sql-查询语句,param-参数,nameSpace-命名空间)为key,以查询返回语句为value
public void test1() throws Exception{
SqlSession session = SqlSessionFac.getSqlSession();
// 第一次查询
User user = userMapper.selectUserById(1);
System.out.println(user.toString());
// 第二次查询
User user2 = userMapper.selectUserById(1);
System.out.println(user2.toString());
session.close();
}
第一次执行select后,会将查询结果储存在sqlSession中,第二次 select ,如果查询参数相同,并且执行同一sql,则直接在缓存中读取数据。
注意 :
- 如果第一次查询之后,执行了(update ,delete,insert),那么mybatis会清空缓存的数据。
- mybatis默认开启一级缓存
二级缓存
- 二级缓存是mapper级别的缓存,也就是同一个namespace的mappe.xml,当多个SqlSession使用同一个Mapper操作数据库的时候,得到的数据会缓存在同一个二级缓存区域
- 二级缓存默认关闭,开启时,会优先将结果缓存到二级缓存中,查询时首先去一级缓存中查找,若没有则在二级缓存中查找,找到则返回查询结果
- 同一级缓存一样:
- 用于储存的hashMap以(sql-查询语句,param-参数,nameSpace-命名空间)为key,以查询返回语句为value
- 如果第一次查询之后,执行了(update ,delete,insert),那么mybatis会清空缓存的数据。