mybatis缓存有两个级别 分别是 一级缓存与二级缓存
一级缓存
默认mybatis采用的是一级缓存。一级缓存的作用效果是SqlSession会话结束,我是用一些简单的代码描述一下。
/**
* 默认一级缓存 缓存在会话结束后清理缓存
*/
@Test
public void test(){
SqlSession session = getSqlSession();
UserMapping mapping = session.getMapper(UserMapping.class);
User user1 = mapping.get("c930cef7-8b5e-11ed-9b71-18c04d77e2ef");
User user2 = mapping.get("c930cef7-8b5e-11ed-9b71-18c04d77e2ef");
User user3 = mapping.get("c930cef7-8b5e-11ed-9b71-18c04d77e2ef");
//这里不关闭 会话不会停止
session.close();
session=getSqlSession();
UserMapping mapper = session.getMapper(UserMapping.class);
User user4 = mapper.get("c930cef7-8b5e-11ed-9b71-18c04d77e2ef");
}
SqlSessionFactory getSqlBuilder(){
InputStream is = this.getClass().getClassLoader().getResourceAsStream("mybatis-config.xml");
return new SqlSessionFactoryBuilder().build(is);
}
SqlSession getSqlSession(){
return getSqlBuilder().openSession();
}
如果在会话结束后会清除缓存,然后重新执行查询
二级缓存
1.二级缓存是需要在映射文件中配置cache
2.二级缓存的作用效果是在同一个会话工厂,也就说只能同一个SqlSessionFactory中二级缓存才生效
3.要求实体类必须继承序列化接口(因为二级缓存采用的就是序列化缓存)
<!--开启二级缓存-->
<cache />
@Test
public void test1(){
SqlSession session = getSqlSession();
UserMapping mapping = session.getMapper(UserMapping.class);
User user1 = mapping.get("c930cef7-8b5e-11ed-9b71-18c04d77e2ef");
User user2 = mapping.get("c930cef7-8b5e-11ed-9b71-18c04d77e2ef");
User user3 = mapping.get("c930cef7-8b5e-11ed-9b71-18c04d77e2ef");
//这里不关闭 会话不会停止
session.close();
session=getSqlSession();
UserMapping mapper = session.getMapper(UserMapping.class);
User user4 = mapper.get("c930cef7-8b5e-11ed-9b71-18c04d77e2ef");
}
// 因为二级缓存要求必须在同一个会话工厂里
SqlSessionFactory factory=null;
SqlSessionFactory getSqlSessionFactory(){
if (factory==null){
InputStream is = this.getClass().getClassLoader().getResourceAsStream("mybatis-config.xml");
factory= new SqlSessionFactoryBuilder().build(is);
}
return factory;
}
SqlSession getSqlSession(){
//参数true 自动提交事务
return getSqlSessionFactory().openSession(true);
}
这里显示只有一个查询语句。