做者 : Stanley 羅昊數據庫
【轉載請註明出處和署名,謝謝!】緩存
首先,咱們先看一下這個標題「查詢緩存」,那就說明跟增、刪、改是沒有任何關聯的,只有在查詢時,纔會遇到緩存,增刪改不涉及!session
查詢緩存目前Mybatis中提供了兩個,分別是:一級緩存、二級緩存;mybatis
先說一下一級緩存的範圍:同一個SqlSession對象,也就說,咱們是同一個SqlSession對象,又要進行一樣的查詢操做,那麼,咱們就能夠去緩存中獲取;app
因此,SqlSession的緩存,是屬於一級緩存;框架
那,又有什麼用呢?性能
好比,咱們如今數據庫中有兩條數據,分別是張三跟李四;spa
我如今呢,要根據name來查詢張三這我的,首先說明一點,這是第一次去根據name來查詢張三,這個時候呢,咱們就會去訪問數據庫,去獲取name是張三的數據,拿到張三後,它會把張三又放進了Sqlssion對象中去了,Sqlssion對象存在內存中;3d
也就是說,咱們第一次查完後,咱們會將張三這個數據從數據庫中獲取一下,獲取後放到緩存裏面,此時的緩存就在內存裏面,具體的來講,它就在Sqlsession對象裏面;code
上述操做以下圖:
若是,再有一次或再有N次來查詢這個張三,我就不須要去訪問數據庫了,由於我在緩存裏面已經有了,若是你再要拿這個張三,直接直接從緩存裏面去拿;
所以呢,咱們能夠發現,緩存能夠減小數據庫的訪問;
咱們都知道,數據庫的打開與關閉均比較費性能,因此,咱們就不須要從數據庫中拿了,直接從緩存中去獲取就完事了,意思就是能夠提升性能;
只要執行你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也受不了,因此就存在這樣的機制;