Mybatis的一级缓存是默认开启的,它只相对于同一个SqlSession有效,所以也称之为SqlSession缓存。当参数和SQL完全相同的情况下,使用同一个SqlSession对象调用同一个Mapper方法,当第1次执行SQL语句后,MyBatis会自动将其放在缓存中,后续再次查询时,如果没有声明需要刷新,且缓存没有超时,会直接取出此前缓存的数据,而不会再次发送SQL到数据库。

Mybatis的二级缓存是默认未开启的,如果希望开启,需要在配置SQL的XML文件中配置<cache>节点,由于每个XML都通过根节点的namespace属性对应一个Mapper接口,所以,二级存储也称之为namespace缓存!在使用二级存储时,查询数据的<select>节点需要配置useCache="true",并且,查询返回的结果类型必须是实现了Serializable接口的!另外,当缓存 了数据后,如果执行了当前XML中配置的增、删、改操作,会自动刷新此前的缓存数据!
关于二级缓存的特点还有许多,例如Mybatis使用了LRU算法来管理缓存的数据,但是,由于Mybatis的缓存在一定程度上是不可控的,所以,在实际应用中,一般并不使用Mybatis的缓存机制来实现数据缓存,而是使用自定义的缓存机制,或第3方缓存服务器,例如Redis、MemCache等!

例如Mybatis会在删除数据后自动刷新缓存数据,其目的是为了保证缓存的数据是有效的,但是,在一些高频率的访问中,刚刚缓存数据就被刷新,再次缓存又再次被刷新,其实是非常浪费性能和资源的,而且,在实际应用中,也不一定真的需要数据是非常精准的,就好比在电商平台购买一部手机,手机的库存值是8000还是6000,都不影响用户的购买,没有必要因为某用户购买成功后就更新手机的库存值!