1、 比较官方的解说是这样的:我们在操作数据库的时候,需要构造sq盟敢势袂lSession对象,然后在对象中有一个(内存区域)数据结构(HashMap)用于存储缓存数据,当我们执行查询语句的时候,会将查询结果缓存到这个map中,如果下次再查询的时候,会先判断先前是不是有个完全一样的查询,是的haul,就直接从缓存中读取,这个就是一级缓存了。 当然要注意,如果第一次查询过后,然后对数据进行了增删改,那么这个map缓存就会被清空了,避免下次查询的时候脏读(就是数据被改掉了,你再从缓存中读的话,数据是不对的) 下面用例子演示一下,首先我们查询一个id为1的用户,然后再一次读取,看看是不是用到一级缓存:
2、首先我们进入debug来执行完第一个次查询,可以看到控制台的日志中显示了查询语句,表明这次是查询数据库来得到数据(查询后会把得到的数据存到缓存中)。
3、然后看看第二次查询相同数据,可以看到没有再出查询语句了,但是得到的数据是正确的,表明这次数据是取一级缓存的,这样就可以不用频繁的访问数据库。
4、但是如果在第一个查询后,修改了数据(此时会清空缓存),那么第二次查询就需要再次访问数据库了,下图两个查询sql都出现了,可以看出调了两次数据库:
5、其实通过上面可以看出,sqlsession这个会话很重要,如果会话关闭了(缓存清空了),那么就什么都没了,同样的,如果我们开启了两个会话:会话1,会话2,会话1刚查询完数据,会话2刚好对这个数据进行修改(此时数据库的数据),那么会话1再查询的时候是从自己会话对象的缓存中取的数据,这时的数据就和数据库的数据不同了(刚才会话2修改过)。
6、所以呢,使用一级缓存的时候要注意需要在同一个sqlsession中使用。要不然使用的就不是一级缓存了,如果要跨sqlsession来使用的话,需要使用二级缓存(下次介绍), 这点要注意。 以上就是关于mybatis的一级缓存的介绍和使用了,如果文章对您有帮助的话,请为我的文章点赞投票,文章内容都是我平时做项目中遇到问题的积累和总结,谢谢了。