Mybatis MyBatis框架的缓存 一级缓存

1. 缓存的概念

  1. 缓存的概念

    1. 在内存中临时存储数据,速度快,可以减少数据库的访问次数。
    2. 经常需要查询,不经常修改的数据,不是特别重要的数据都适合于存储到缓存中。

2.Mybatis缓存

  • mybatis包含了一个非常强大的查询缓存特性,他可以非常方便的定制和配置缓存。缓存可以极大的提高查询的效率
  • mybatis系统当中默认定义了两级缓存:一级缓存和二级缓存
    • 默认情况之下,只有一级缓存开启(sqlSession级别的缓存)
    • 二级缓存需要手动开启配置,需要局域namespace级别的缓存。

1.一级缓存(也叫本地缓存)

  1. MyBatis的一级缓存也是SqlSession的缓存。

  2. SqlSession对象中维护了一个Map集合,用于存储相互的缓存数据。

  3. 查询的时候,先从SqlSession的缓存中查找,如果有,直接返回。如果没有,查询数据库。

  4. 证明一级缓存的存在,通过用户id查询2次,查看结果。

    java 复制代码
    public class UserTest {
        private InputStream in = null;
        private SqlSession session = null;
        private UserDao mapper = null;
    
        /**
         * 测试查询所有的方法
         */
        @Test
        public void findById() throws IOException {
            //加载主配置文件,目的是为了构建SqlSessionFactory对象
            in = Resources.getResourceAsStream("SqlMapConfig.xml");
            //创建SqlSessionFactory对象
            SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
            //通过SqlSessionFactory工厂对象创建SqlSesssion对象
            session = factory.openSession();
            //通过Session创建UserDao接口代理对象
            mapper = session.getMapper(UserDao.class);
    
            User user1 = mapper.findById(1);
            System.out.println(user1.toString());
            System.out.println("-----------------");
            User user2 = mapper.findById(1);
            System.out.println(user2.toString());
            System.out.println(user1 == user2);
            //释放资源
            session.close();
            in.close();
        }
    }

    缓存失效的情况:

  • sqlSession不同
  • sqlSession相同,查询条件不同
  • sqlSession相同,两次查询之间执行了增删改操作
  • sqlSession相同,手动清除一级缓存
相关推荐
Java永无止境1 小时前
延时任务之Redis 过期事件监听原理与缺陷
数据库·redis·缓存·延时任务
java1234_小锋2 小时前
Redis线上操作最佳实践有哪些?
数据库·redis·缓存
卡布叻_星星6 小时前
后端笔记之MyBatis 通过 collection 标签实现树形结构自动递归查询
java·笔记·mybatis
z晨晨7 小时前
Java求职面试实战:从Spring到微服务的全面挑战
java·数据库·spring·微服务·面试·技术栈
麦兜*7 小时前
Redis多租户资源隔离方案:基于ACL的权限控制与管理
java·javascript·spring boot·redis·python·spring·缓存
gsfl7 小时前
Redis 数据库管理与通信基础
数据库·redis·缓存
gsfl8 小时前
Redis 扩展数据类型
数据库·redis·缓存
xcg3401238 小时前
Spring boot中 限制 Mybatis SQL日志的大字段输出
spring boot·sql·mybatis·大字段打印
西岭千秋雪_9 小时前
Spring AI alibaba Prompt模板&Advisor自定义
java·人工智能·spring·prompt
彭于晏Yan12 小时前
MyBatis-Plus使用动态表名分表查询
java·开发语言·mybatis