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的组成
- 方法的全限定类名
- 分页条件
- 查询语句
- 环境
即在上述条件不变的情况下就会命中缓存
4.结果分析
在一级缓存中,是直接将查询到的对象存入到list集合中,再次查询时不会创建新的对象,所以测试结果为true。
以上是关于mybatis的一级缓存的主要内容,如果未能解决你的问题,请参考以下文章
MyBatis系列目录--5. MyBatis一级缓存和二级缓存(redis实现)