简述
mybatis提供了缓存机制减轻数据库压力,提高数据库性能。
mybatis的缓存分为两级:一级缓存、二级缓存。
一级缓存
一级缓存是在SqlSession上的缓存,默认情况下,MyBatis系统会开启一级缓存,也就是对于SqlSession层面的缓存,这个缓存不需要POJO对象可序列化。
测试一级缓存:
@Test
public void testFindUser() throws IOException {
//读取核心配置文件
String file = "sqlMapConfig.xml";
InputStream in = Resources.getResourceAsStream(file);
//日志
Logger logger = Logger.getLogger(MybatisFirstTest.class);
//创建sqlsessionfactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
//创建sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User u = userMapper.getUser(1L);
logger.info("再获取一次POJO....");
User u1 = userMapper.getUser(1L);
sqlSession.close();
}
这段代码对同一对象进行两次获取,但是在日志中显示只有一条SQL语句被执行,原因是使用了同一个SqlSession对象获取数据,当一个SqlSession第一次通过SQL和参数获取对象后会将其缓存起来,如果下一次SQL和参数没有发生变化,并且缓存没有超时或者需要刷新时,它就会从缓存中直接取数据。
二级缓存
二级缓存是在SqlSessionFactory上的缓存,默认情况下,MyBatis系统不会开启二级缓存,需要手动开启,开启二级缓存只需要在映射文件上添加代码:
<cache/>
这个时候MyBatis会序列化和反序列化对应的POJO对象,也就要求POJO需要实现序列化接口。如果实体类没有实现序列化接口,MyBatis会抛出异常。
public class User implements Serializable{
public static final long serialVersionUID = 598736524547906734L;
.........................
}
这个时候从日志上就可以看到不同的SqlSession在获取同一条记录时,都是只发送过一次SQL获取数据,MyBatis将其保存在SqlSessionFactory层面,提供给各个SqlSession使用。