@(MyBatis)[Java, 框架, MyBatis]java
默認就能夠使用sql
框架處理緩存是 依賴sql映射id ,Mybatis的內部緩存使用一個HashMap,key爲hashcode+statementId+sql語句。Value爲查詢出來的結果集映射成的java對象。數據庫
一級緩存的做用域是一個SqlSession ,一旦session發生變化,一級緩存失敗緩存
在同一個SqlSession中,執行相同的查詢SQL,第一次會去查詢數據庫,並寫到緩存中;第二次直接從緩存中取。當執行SQL時兩次查詢中間發生了增刪改操做,則SqlSession的緩存清空。session
每次查詢會先去緩存中找,若是找不到,再去數據庫查詢,而後把結果寫到緩存中。mybatis
默認沒法使用app
若是想要使用,須要進行配置, 在映射文件中增長標籤<cache></cache>
框架
要求緩存類必須實現可序列化接口spa
二級緩存是mapper級別的。Mybatis默認是沒有開啓二級緩存。code
第一次調用mapper下的SQL去查詢用戶信息。查詢到的信息會存到該mapper對應的二級緩存區域內。
第二次調用 相同namespace下的mapper映射文件中相同的SQL 去查詢用戶信息。會去對應的二級緩存內取結果。
若是調用相同namespace下的mapper映射文件中的增刪改SQL,並執行了commit操做。此時會清空該namespace下的二級緩存。
(1)主配置文件mybatis-config.xml中作以下配置:
<settings> <setting name="lazyLoadingEnabled" value="true" /> <setting name="aggressiveLazyLoading" value="false" /> <setting name="cacheEnabled" value="true"/> </settings>
2)在映射文件中,加入如下內容,開啓二級緩存:
<cache eviction="" flushInterval="" readOnly="true" size=""/>
(3)緩存類實現序列化
因爲二級緩存的數據不必定都是存儲到內存中,它的存儲介質多種多樣,因此須要給緩存的對象執行序列化。
若是該類存在父類,那麼父類也要實現序列化。
該statement中設置userCache=false能夠禁用當前select語句的二級緩存,即每次查詢都是去數據庫中查詢,默認狀況下是true。
<select id="" parameterType="" resultType="" useCache="false"> .... </select>
<select id="" parameterType="" resultType="" useCache="false" flushCache="true"> .... </select>