mybatis的一级缓存

Posted 背时的哥哥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mybatis的一级缓存相关的知识,希望对你有一定的参考价值。

文章目录

1.前言

先上代码:

SqlSession sqlSession = sqlSessionFactory.openSession();
        BookMapper mapper = sqlSession.getMapper(BookMapper.class);
        Book book1 = mapper.findById(1);
        Book book2 = mapper.findById(1);
        System.out.println(book1 == book2);


结果显示为true,那么通过同一个sqlSession会话进行相同查询,查询到的结果对象为同一对象。可想而知,在此处是用到了mybatis的一级缓存,那我们就来看看它是如何实现的!

查看源码可知,在MyBatis中,一级缓存默认时打开的!

2.源码分析

1.创建测试代码

//使用同一会话调用两次查询方法
 SqlSession sqlSession = sqlSessionFactory.openSession();
        BookMapper mapper = sqlSession.getMapper(BookMapper.class);
        List<Book> query = mapper.query();
        List<Book> query1 = mapper.query();

2.如何创建缓存

1.首先mybatis会查看是否存在缓存

2.若没有则先调用queryFromDatabase()方法查询数据库,再将查到的结果存入缓存中

3.如何命中缓存

第二次查询时,会根据key值从缓存中去除数据,先看看key的组成

  1. 方法的全限定类名
  2. 分页条件
  3. 查询语句
  4. 环境
    即在上述条件不变的情况下就会命中缓存

4.结果分析

在一级缓存中,是直接将查询到的对象存入到list集合中,再次查询时不会创建新的对象,所以测试结果为true。

以上是关于mybatis的一级缓存的主要内容,如果未能解决你的问题,请参考以下文章

MyBatis一级缓存和二级缓存

Mybatis从入门到精通系列 12——Mybatis 的一级缓存与二级缓存

MyBatis 一级缓存与二级缓存

MyBatis一级缓存和二级缓存

MyBatis缓存机制

mybatis——一级缓存二级缓存