1.一级缓存
一级缓存----基于SqlSession级别的缓存。默认一级缓存是开启的,不能关闭。
一级缓存---必须查询同一个数据
缓存不能命中,则向数据库查询-发送sql语句、把查询的结果放入缓存中。
SqlSession session=factory.openSession();
UsersMapper mapper = session.getMapper(UsersMapper.class);
Users users = mapper.selectByPrimaryKey(2);
2.二级缓存
工作机制:
一个会话查询一条数据,这个数据就会被放在当前会话的一级缓存中;
如果当前会话关闭了,这个会话对应的一级缓存就没了,但是我们想要的是,会话关闭了,一级缓存中的数据被保存到二级缓存中;
新的会话被查询信息,就可以从二级缓存中获取内容;
不同的mapper查出的数据会放在自己对应的缓存(map)中;
二级缓存需要手动开启在 MyBatis.xml 文件中
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
在映射文件中xxxMapper.xml 使用
<cache/>
在实体类中实现序列化:
@Data
@AllArgsConstructor
@NoArgsConstructorpublic
public class User implements Serializable
{
private int id;
private String name;
private String pwd;
}
测试 接口和xml配置的sql语句与一级缓存的一致
@Test
public void test03() throws Exception{
Reader resourceAsReader = Resources.getResourceAsReader("mybatis.xml");
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(resourceAsReader);
SqlSession session=factory.openSession();
UsersMapper mapper = session.getMapper(UsersMapper.class);
//查询编号=2的用户信息--缓存不能命中,则向数据库查询-发送sql语句、把查询的结果放入缓存中。
//查询的结果放入一级缓存和二级缓存。 如果二级缓存能命中
Users users = mapper.selectByPrimaryKey(2);
System.out.println(users);
session.close();
//开启新的SqlSession
SqlSession session1=factory.openSession();
UsersMapper mapper1 = session1.getMapper(UsersMapper.class);
Users users1 = mapper1.selectByPrimaryKey(2);
System.out.println(users1);
}
查询顺序: 二级缓存----一级缓存----数据库。