mybatis缓存机制

前言

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();
    }


}

执行DML语句后,一级缓存清除,第二次查询有查询语句生成
数据库并没有变动,但查询出的结果为更新语句中的数据
在这里插入图片描述
所以用一个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共享缓存中内容
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值