mybatis的缓存分为两种  一级缓存和二级缓存 
一级缓存是基于sqlSession级别的缓存 二级缓存是基于mapper级别的缓存
一级缓存默认开启  二级缓存默认关闭
当用户使用同一个sqlSession时查询到的数据可能是一级缓存的数据
不同的sqlSession使用同一个mapper时查询,查询到的数据可能是另一个sqlSession做相同操作留下的缓存
如果你配置了二级缓存,那么查询数据的顺序应该为:二级缓存→一级缓存→数据库
存放二级缓存数据的地方在Configration中
当一个sqlSession刷新或者关闭时,对应的缓存会被清空  使用select默认不会清空缓存  insert、update、delete默认会清空一级缓存
当一个用户通过sqlsession发送一条请求时,sqlsession会把sql语句交给executor,executor会先去本地缓存中查询是否有需要的数据,如果要是有会先从本地缓存中取出来,要是没有会跟数据库进行交互,
把查询出来的数据放到本地缓存,然后在返给用户
一级缓存的有效期
	1当不是同一个sqlSession时  s1中的缓存 s2中不能用
	2.当sqlSession调用.clearCache()方法的时候会自动清空缓存
	3.当sqlSession对象关闭时
	4. insert、update、delete默认会清空一级缓存
一级缓存实现的原理及性能分析
	1.一级缓存通过简单的Map集合来实现,并没有对map集合的大小,容量进行限制
	2.一级缓存是粗粒度缓存,没有办法去精确控制缓存中的数据是否存在过长,是否过期,以及更新缓存数据
	3.多个sqlsession对象缓存中的数据无法共享
二级缓存  (一个xml文件对应一个二级缓存)
	二级缓存需要手动配置
	1.在总的配置文件中开启二级缓存 
| <setting name="cacheEnabled" value="true"/> | 
    2.在想要开启二级缓存的xml文件中加入  <cache></cache>标签
    3.实体类实现serializable接口,进行序列化
    执行顺序  二级缓存→一级缓存→数据库
    eviction:缓存的回收策略
            LRU - 最近最少使用,移除最长时间不被使用的对象
            FIFO - 先进先出,按对象进入缓存的顺序来移除它们
            SOFT - 软引用,移除基于垃圾回收器状态和软引用规则的对象
            WEAK - 弱引用,更积极地移除基于垃圾收集器和弱引用规则的对象
            默认的是LRU 
    flushInterval:缓存刷新间隔
            缓存多长时间清空一次,默认不清空,设置一个毫秒值
    readOnly:是否只读
    true:只读:mybatis认为所有从缓存中获取数据的操作都是只读操作,不会修改数据。
     mybatis为了加快获取数据,直接就会将数据在缓存中的引用交给用户 。不安全,速度快
    false:读写(默认):mybatis觉得获取的数据可能会被修改
    mybatis会利用序列化&反序列化的技术克隆一份新的数据给你。安全,速度相对慢
    size:缓存存放多少个元素
    type:指定自定义缓存的全类名(实现Cache接口即可)
    
在新的sqlSession中对象,使用二级缓存需要先将前面的sqlSession对象关闭,数据才会进入二级缓存

一级缓存运行图

二级缓存运行原理图
