1.在沒有配置的狀況下,mybatis默認開啓一級緩存。緩存
1 Object object=mapper.getXxx(object); 2 Object object2=mapper.getXxx(object);
打個斷點測試一下就知道了。session
在同一個SqlSession中,第一次查詢後,調用mapper相同方法,SqlSession會從一級緩存中取數據,並且獲得的是相同的對象。不會發送SQL。mybatis
若是SqlSession進行了提交,那麼一級緩存將會清除。app
1 public void test(){ 2 SqlSession session = MyBatisUtil.getSession(); 3 IUserDAO mapper = session.getMapper(IUserDAO.class); 4 UserOneToMany user = new UserOneToMany(); 5 user.setUsercode("zhangsan"); 6 UserOneToMany userOneToMany = mapper.getUserOneToManyBills(user); 7 System.out.println("======"+userOneToMany); 8 session.commit(); 9 UserOneToMany userOneToMany2 = mapper.getUserOneToManyBills(user); 10 System.out.println("======"+userOneToMany2); 11 session.close(); 12 }
打印結果不一樣,且發送了兩次SQL,得到了兩個不一樣的對象:測試
2.MyBatis開啓二級緩存第一步:大配置中settings節點加入:<setting name="cacheEnabled" value="true"/>spa
第二步:命名空間加入節點:<cache/>code
這裏<cache/>節點能夠設置得更詳細些,好比:對象
<cache eviction="LRU" flushInterval="100000" size="1024" readOnly="true"/>
其中eviction表明回收策略(LRU|FIFO|SOFT|WEAK);flushInterval表明刷新間隔時間,單位是毫秒;size是引用數目,就是緩存中能夠存放多少個對象;readOnly只讀,緩存只能讀取不能修改。blog
簡單說明下四個回收策略:接口
1.LRU(默認):最近最少使用,移除最長時間不用的對象。
2.FIFO:先進先出,按對象進入緩存的順序移除它們。
3.SOFT:軟引用,移除基於垃圾回收器狀態和軟引用規則的對象。
4.WEAK:弱引用,移除基於垃圾回收器狀態和弱引用規則的對象。
第三步:相應實體類實現Serializable接口
測試方法不變,觀察結果:
首先,程序只發送了一次SQL。其次,第二次取到的數據是從緩存中得到的,一樣獲取的是兩個不一樣的對象。