前言
mybatis缓存为二级架构,一级缓存默认开启,作用域为session,二级缓存默认关闭,作用域为mapper,mybatis缓存了解即可
一级缓存
一级缓存测试
public class test1 {
@Test
public void fun1(){
SqlSession session = MybatisUtil.createSqlsession();
UserMapper userMapper = session.getMapper(UserMapper.class);
//对于id为3的用户查询
System.out.println(userMapper.selectbyid(3));
System.out.println(userMapper.selectbyid(2));
//对于id为3的用户再次查询,没有查询语句,直接给出结果
System.out.println(userMapper.selectbyid(3));
session.close();
}
}
执行DML语句,一级缓存自动清除测试
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.wj.dao.mapper.IdCardMapper;
import com.wj.dao.mapper.UserMapper;
import com.wj.dao.pojo.IdCard;
import com.wj.dao.pojo.User;
import com.wj.util.MybatisUtil;
import org.apache.ibatis.session.RowBounds;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;
import java.util.logging.Logger;
/**
* @Description:
* @Author WJ
* @Date 2023/2/14:10:08
* @Version V1.0
**/
public class test1 {
@Test
public void fun1(){
SqlSession session = MybatisUtil.createSqlsession();
UserMapper userMapper = session.getMapper(UserMapper.class);
//对于id为3的用户查询
System.out.println(userMapper.selectbyid(3));
System.out.println(userMapper.selectbyid(2));
//执行DML语句
System.out.println(userMapper.upset("杨过","11111111",3));
//对于id为3的用户再次查询,没有查询语句,直接给出结果
System.out.println(userMapper.selectbyid(3));
//注释commit一级缓存还是清除了,并且数据库并没有更新,查询出了一个错误的结果
//session.commit();
session.close();
}
}
数据库并没有变动,但查询出的结果为更新语句中的数据
所以用一个session多次查询时一定要commit。我学习的书上说DML语句若是不commit,一级缓存不会更新,但在我的测试中不commit也会清除缓存,再次查询还会得到更新后的结果,但此时数据库中并没有更新成功,不知道什么原因。
自主清除缓存测试
//调用sqlsession的claerCache()方法清除一级缓存
session.clearCache();
二级缓存
配置
开启二级缓存
二级缓存
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.wj.dao.mapper.IdCardMapper;
import com.wj.dao.mapper.UserMapper;
import com.wj.dao.pojo.IdCard;
import com.wj.dao.pojo.User;
import com.wj.util.MybatisUtil;
import org.apache.ibatis.session.RowBounds;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;
import java.util.logging.Logger;
/**
* @Description:
* @Author WJ
* @Date 2023/2/14:10:08
* @Version V1.0
**/
public class test1 {
@Test
public void fun1(){
SqlSession session1 = MybatisUtil.createSqlsession();
SqlSession session2 = MybatisUtil.createSqlsession();
UserMapper userMapper1 = session1.getMapper(UserMapper.class);
//mapper1查询
System.out.println(userMapper1.selectbyid(3));
//清除一级缓存
session1.close();
//mapper2查询,二级缓存开启,不会有查询语句生成
UserMapper userMapper2 = session2.getMapper(UserMapper.class);
System.out.println(userMapper2.selectbyid(3));
session2.close();
}
}
二级缓存开启,同一个mapper文件得到的所有session共享缓存中内容