1、一级缓存
mybatis默认开启的是一级缓存
但是由于一级缓存只是存在于会话中 也就是sqlsession连接和关闭的这段时间
测试
一级缓存demo
pojo实体层
public class User {
private int id;
private String name;
private String password;
public User() {
}
public User(int id, String name, String password) {
this.id = id;
this.name = name;
this.password = password;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getpassword() {
return password;
}
public void setpassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", password='" + password + '\'' +
'}';
}
mapper层
UserMapper接口
public interface UserMapper {
User queryUserById(@Param("Uid") int id);
int updateUser(User user);
}
UserMapper.xml
<mapper namespace="com.hq.mapper.UserMapper">
<!--返回结果类型是别名 需要在mybatis-config.xml中配置-->
<select id="queryUserById" resultType="user" parameterType="_int" >
select * from user where id =#{Uid}
</select>
</mapper>
测试:
@Test
public void queryUserById1(){
// 在一个session中查询两次相同的记录查询只会走一次
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.queryUserById(1);
System.out.println(user);
System.out.println("================");
User user1 = mapper.queryUserById(1);
System.out.println(user1);
System.out.println(user==user1);
sqlSession.close();
}
结果截图:
2、二级缓存
二级缓存开启的步骤
//显示的开始全局缓存
mybatis-config.xml
<setting name="cacheEnabled" value="true"/>
相应的mapper.xml加入 以下标签 表示在当前xml使用二级缓存
这个更高级的配置创建了一个 FIFO 缓存,每隔 60 秒刷新,
最多可以存储结果对象或列表的 512 个引用,而且返回的对象被认为是只读的,因此对它们进行修改可能会在不同线程中的调用者产生冲突
<cache
eviction="FIFO"
flushInterval="60000"
size="512"
readOnly="true"/>
增删查改 标签加入以下属性表示使用缓存
useCache="true"
工作机制
1 一个会话查询一条数据,这个数据就会被放在当前会话的一级缓存中;
2 如果当前会话关闭了,这个会话对用的以及缓存就没了,但是我们想的是,会话关闭了 一级缓存中的数据就被保存到二级缓存中;
3 新的会话信息,就可以从二级缓存中获取内容
4 不同的mapper查出的数据放在自己对应的缓存map中
mybatis-config.xml
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
<!-- 显示的开启全局缓存-->
<setting name="cacheEnabled" value="true"/>
</settings>
UserMapper.xml
<cache
eviction="FIFO"
flushInterval="60000"
size="512"
readOnly="true"/>
<select id="queryUserById" resultType="user" parameterType="_int" useCache="true" >
select * from user where id =#{Uid}
</select>
测试
@Test
public void queryUserById(){
// 在一个session中查询两次相同的记录查询只会走一次
SqlSession sqlSession = MybatisUtils.getSqlSession();
SqlSession sqlSession1 = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.queryUserById(1);
System.out.println(user);
System.out.println("================");
sqlSession.close();
UserMapper mapper1 = sqlSession1.getMapper(UserMapper.class);
User user1 = mapper1.queryUserById(1);
System.out.println(user1);
System.out.println(user==user1);
sqlSession1.close();
}
测试结果如下