关于MyBatis 缓存的理解

mybatis缓存有两个级别 分别是 一级缓存二级缓存

一级缓存

默认mybatis采用的是一级缓存。一级缓存的作用效果是SqlSession会话结束,我是用一些简单的代码描述一下。

    /**
     * 默认一级缓存 缓存在会话结束后清理缓存
     */
    @Test
    public void test(){
        SqlSession session = getSqlSession();
        UserMapping mapping = session.getMapper(UserMapping.class);
        User user1 = mapping.get("c930cef7-8b5e-11ed-9b71-18c04d77e2ef");
        User user2 = mapping.get("c930cef7-8b5e-11ed-9b71-18c04d77e2ef");
        User user3 = mapping.get("c930cef7-8b5e-11ed-9b71-18c04d77e2ef");

        //这里不关闭 会话不会停止
        session.close();
        session=getSqlSession();
        UserMapping mapper = session.getMapper(UserMapping.class);
        User user4 = mapper.get("c930cef7-8b5e-11ed-9b71-18c04d77e2ef");

    }
    SqlSessionFactory getSqlBuilder(){
        InputStream is = this.getClass().getClassLoader().getResourceAsStream("mybatis-config.xml");
        return new SqlSessionFactoryBuilder().build(is);
    }
    SqlSession getSqlSession(){
        return getSqlBuilder().openSession();
    }

在这里插入图片描述如果在会话结束后会清除缓存,然后重新执行查询

二级缓存

1.二级缓存是需要在映射文件中配置cache
2.二级缓存的作用效果是在同一个会话工厂,也就说只能同一个SqlSessionFactory中二级缓存才生效
3.要求实体类必须继承序列化接口(因为二级缓存采用的就是序列化缓存)

    <!--开启二级缓存-->
    <cache />
    @Test
    public void test1(){
    SqlSession session = getSqlSession();
    UserMapping mapping = session.getMapper(UserMapping.class);
    User user1 = mapping.get("c930cef7-8b5e-11ed-9b71-18c04d77e2ef");
    User user2 = mapping.get("c930cef7-8b5e-11ed-9b71-18c04d77e2ef");
    User user3 = mapping.get("c930cef7-8b5e-11ed-9b71-18c04d77e2ef");

    //这里不关闭 会话不会停止
    session.close();
    session=getSqlSession();
    UserMapping mapper = session.getMapper(UserMapping.class);
    User user4 = mapper.get("c930cef7-8b5e-11ed-9b71-18c04d77e2ef");
}
	// 因为二级缓存要求必须在同一个会话工厂里
    SqlSessionFactory factory=null;
    SqlSessionFactory getSqlSessionFactory(){
        if (factory==null){
            InputStream is = this.getClass().getClassLoader().getResourceAsStream("mybatis-config.xml");
            factory= new SqlSessionFactoryBuilder().build(is);
        }
        return factory;
    }
    SqlSession getSqlSession(){
        //参数true 自动提交事务
        return getSqlSessionFactory().openSession(true);
    }

在这里插入图片描述
这里显示只有一个查询语句。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值