首先,咱们先看一下这个标题“查询缓存”,那就说明跟增、删、改是没有任何关联的,只有在查询时,才会遇到缓存,增删改不涉及!数据库
查询缓存目前Mybatis中提供了两个,分别是:一级缓存、二级缓存;缓存
先说一下一级缓存的范围:同一个SqlSession对象,也就说,咱们是同一个SqlSession对象,又要进行一样的查询操做,那么,咱们就能够去缓存中获取;bash
因此,SqlSession的缓存,是属于一级缓存;session
那,又有什么用呢?mybatis
好比,咱们如今数据库中有两条数据,分别是张三跟李四;app
我如今呢,要根据name来查询张三这我的,首先说明一点,这是第一次去根据name来查询张三,这个时候呢,咱们就会去访问数据库,去获取name是张三的数据,拿到张三后,它会把张三又放进了Sqlssion对象中去了,Sqlssion对象存在内存中;框架
也就是说,咱们第一次查完后,咱们会将张三这个数据从数据库中获取一下,获取后放到缓存里面,此时的缓存就在内存里面,具体的来讲,它就在Sqlsession对象里面;性能
上述操做以下图:spa
若是,再有一次或再有N次来查询这个张三,我就不须要去访问数据库了,由于我在缓存里面已经有了,若是你再要拿这个张三,直接直接从缓存里面去拿;3d
所以呢,咱们能够发现,缓存能够减小数据库的访问;
咱们都知道,数据库的打开与关闭均比较费性能,因此,咱们就不须要从数据库中拿了,直接从缓存中去获取就完事了,意思就是能够提升性能;
只要执行你commit(提交)这个方法,那么就会直接将SqlSession对象所有清空掉,一旦执行commit,就会清理咱们的缓存对象;
上述以下图:
首先,这些操做,咱们不须要去手动的去编写,咱们仅需知道并了解便可,由于Mybatis默认了就开启了一级缓存;
总结:
若是用相同的SqlSession对象查询相同的数据,则只会在第一次查询时发送Sql语句,并将这个查询的结果放入到Sqlsession中(做为缓存存在);
后续再次查询该赞成的对象时,则直接从缓存中查询该对象便可(即省略了数据库的访问)
首先,这个Mybatis自带二级缓存;
也有三方提供的二级缓存;
Mybatis以为缓存很重要,因此就自带了一个缓存,可是,Mybatis一定不是搞缓存的,搞数据的,可是第三方公司给你提供了一些缓存,由于你mybatis作缓存这块儿不是专业的;
咱们能够回顾一下,一级缓存是同一个Sqlsession对象,那么二级缓存呢?
二级缓存是同一个在同一个namespace生成的mapper对象,重点是这个namespace;
也就是说,哪怕你生成了许多对象,只要你这个对象来自同一个namespace,它们就会共享同一个缓存;
什么是namespace,我在这里就不强调了,由于这个是mybatis入门必学的;
简单点来讲:
只要产生的xxxMapper对象来自于同一个namespace,则,这个对象共享二级缓存;
二级缓存的这个共享范围,是同一个namespace产生的xxxMapper对象;
开启缓存很简单,若是你是boot项目的话,直接在你须要开启的mapper.xml中加上一句话,来表示本namespace开启了二级缓存:
<cache/>;
复制代码
若是是ssm框架的话,须要在conf.xml中添加一些配置:
在这里,顺便提一下,mybatis的二级缓存是属于序列化,序列化的意思就是从内存中的数据传到硬盘中,这个过程就是序列化;
反序列化意思就是相反而已;
也就是说,mybatis的二级缓存,实际上就是将数据放进了硬盘文件中去了;
若是你要使用mybatis的二级缓存,那么你除了要在你须要缓存的mappe.xml中开启之外,你还须要实现序列化的接口,在你须要使用二级缓存的实体类中;
去实现这个 Serializable(序列化)接口便可;
如今呢,你仅仅的将Student类给序列化了,Student有父类、级联属性,它们是不会跟着被序列化的,因此光这些是不够的;
其实很简单,若是Student须要序列化,可是这个类中还有其余类的属性,仅需将其余类也序列化便可!
好比学生类中继承了父类,那么父类也须要实现Serializable这个接口进行序列化;
该序列化也序列化了,也已经在你须要进行缓存的mapper.xml文件中也开启缓存了,可是若是你使用原生的SqlsessionFacotry(SSM\SpringBoot除外由于是集成好的不须要写底层)去写的时候会发现,缓存并无起效,而是关闭Session(session.close())才生效了;
这个其实就是mybatis的一个机制,其实很好理解;
好比,我如今去查询张三,获取张三数据以后咱们须要通过序列化而后存贮到硬盘上,上面我也说过了,mybatis的二级缓存实际上就是将数据保存到硬盘上的某个文件中了,照这样,每来一个新的对象,好比张三存进来了,李四也须要存,王五也须要,若是是存储到硬盘上,那么就会用到IO技术,众所周知,IO也是比较费性能,因此这个机制就是当你关闭session的时候,咱们把这些张3、李4、王五这些数据一起保存到硬盘上,而不是来一个保存一个这样IO也受不了,因此就存在这样的机制;