一别伏、歷史回顧
(一)、歷史回顧
二、Mybatis一級緩存與二級緩存
(一)、查詢緩存
只有查詢在有掰邢,增刪改是沒有緩存的牺陶。
1、一級緩存:同一個(gè)SqlSession對象辣之。
Mybatis默認(rèn)開啟一級緩存义图,如果用同樣的SqlSession對象查詢相同的數(shù)據(jù),則只會在第一次查詢時(shí)向數(shù)據(jù)庫發(fā)送SQL語句召烂,并將查詢的結(jié)果放入到SqlSession中(作為緩存存在);后續(xù)再次查詢該同樣的對象時(shí)娃承,則直接從緩存中查詢該對象即可(即省略了數(shù)據(jù)庫訪問)奏夫。如果中間發(fā)生了commit()操作,則清空SqlSession历筝。再次讀取數(shù)據(jù)的時(shí)酗昼,需要再次查詢數(shù)據(jù)庫。
例:
測試類和結(jié)果:
2梳猪、二級緩存
(1)麻削、Mybatis自帶二級緩存:同一個(gè)namespace生成的mapper對象。例:CityMapper cityMapper = (CityMapper) sqlSession.getMapper(CityMapper.class);?
回顧:namespace的值春弥。就是接口的全類名(包名.類名)呛哟。通過接口可以產(chǎn)生一個(gè)mapper對象,這個(gè)對象是一個(gè)動(dòng)態(tài)代理對象匿沛。
結(jié)論:只要產(chǎn)生的xxxMapper對象來自于同一個(gè)namespace扫责,則這些對象共享二級緩存。
Mybatis默認(rèn)關(guān)閉二級緩存逃呼,打開二級緩存:
在對應(yīng)的xxxMapper.xml配置cache標(biāo)簽:
注:Mybatis的二級緩存是將對象放入硬盤文件中鳖孤,也就是說準(zhǔn)備緩存的對象必須實(shí)現(xiàn)序列化接口。需要序列化的類抡笼,如果里面有級聯(lián)屬性的類苏揣,也需要序列化。
這里關(guān)閉SqlSession進(jìn)行二級緩存的保存推姻,在關(guān)閉SqlSession的時(shí)候平匈,把一級緩存存儲一份到二級緩存。
二級緩存的范圍是同一個(gè)namespace藏古,如果有多個(gè)xxxMapper.xml的namespace值相同吐葱,則通過這些xxxMapper.xml產(chǎn)生的xxxMapper對象仍然共享二級緩存
例:
conf.xml配置:
xxxMapper.xml配置:
實(shí)體類:
測試類:
(2)、三方提供的二級緩存:
第三方緩存有:ehcache校翔、memcache等弟跑。要想整合三方提供的二級緩存(或自定義二級緩存),必須實(shí)現(xiàn)org.apache.ibatis.cache.Cache接口防症。該接口的默認(rèn)實(shí)現(xiàn)類是PerpetualCache孟辑。
整合步驟:
a哎甲、jar包:Ehcache-core.jar、mybatis-Ehcache.jar饲嗽、slf4j-api.jar
b炭玫、編寫配置文件(ehcache.xml):
c、開啟緩存:
xxxMapper.xml配置:
例:
把上例按照上面的方式修改貌虾。
3吞加、二級緩存與一級緩存圖解: