------------吾亦無他,唯手熟爾,謙卑若愚,好學若饑-------------
緩存------------------------------------------》
很熟悉的一個詞,什麼是緩存?
好多人都不太能解釋清楚緩存的概念,運用到緩存的地方大家都很清楚,像什麼網站了,視訊緩存啊,等等
我從百度百科copy一個緩存的概念,讀一下,免得看完這篇部落格都對緩存的概念一無所知
緩存就是資料交換的緩沖區(稱作Cache),當某一硬體要讀取資料時,會首先從緩存中查找需要的資料,如果找到了則直接執行,找不到的話則從記憶體中找。由于緩存的運作速度比記憶體快得多,故緩存的作用就是幫助硬體更快地運作。
-------------------------------》
有了一定概念了把,MyBatis中有些實作不同,不過意思相似,不然也不會叫做緩存
MyBatis中一級緩存(他是預設開啟的)
在同一個SqlSession中,執行相同的查詢SQL,第一次會去查詢資料庫,并寫到緩存中;第二次直接從緩存中取。
MyBatis緩存裡面實則是個hashmap,key值為hashcode+selectId+sql語句,value為查詢傳回結果的記憶體位址的引用(指針),
哦,筆者你講了這麼多,不是廢話嗎?預設開啟,不需要手動配置,手動使用,我看了有什麼用?
是為了更好的了解程式設計的靈魂,深入它的全部,才會有所成
一級緩存存在性的證明
說了這麼多,筆者你怎麼知道有一級緩存存在呢?如果别人問我,我怎麼更快的跟他解釋清楚呢?
單測方法
/*一級緩存存在性證明sql*/
@Test
public void t2LevelOneCacheHasExist(){
SqlSession session= MyBatisUtils.getSession();
IDeptDAO mapper = session.getMapper(IDeptDAO.class);
Dept d1 = mapper.findDeptnoALLEmpsMoreSql(1);
System.out.println(d1.getDeptName());
System.out.println("==================我是特别的高貴的分割線==================");
Dept d2 = mapper.findDeptnoALLEmpsMoreSql(1);
System.out.println(d2.getDeptName());
session.close();
}
運作結果

看到分割線下面了嗎?沒有對資料庫做sql語句的查詢操作,直接得的結果,難道還不能說明它中間有一道,從緩存中拿的結果嗎?(上面倆條sql是因為做的關聯查詢的直接加載)
--------------------------------------》
增删改對一級緩存的影響:
口說無憑,我直接放代碼
/*增删改對一級緩存的影響*/
@Test
public void t3IUDForLevelOneCache(){
SqlSession session= MyBatisUtils.getSession();
IDeptDAO mapper = session.getMapper(IDeptDAO.class);
Dept d1 = mapper.findDeptnoALLEmpsMoreSql(1);
System.out.println(d1.getDeptName());
Dept dept=new Dept();
dept.setDeptName("無敵是多麼寂寞部");
mapper.addDept(dept);
System.out.println("==================我是特别的高貴的分割線==================");
Dept d2 = mapper.findDeptnoALLEmpsMoreSql(1);
System.out.println(d2.getDeptName());
session.close();
}
下面我放運作結果
在分割線後又做了查詢,說明了增删改會對緩存進行清空操作,清空操作
本次部落格說明了mabatis中一級緩存的存在性證明 (存在的),增删改對一級緩存的影響(會清空一級緩存)-----》
透露一下,下次部落格:《mybatis二級緩存》