關于mybatis基礎我們前面幾篇博客已經(jīng)介紹了很多了,今天我們來說一個簡單的問題,那就是mybatis中的緩存問題。mybatis本身對緩存提供了支持,但是如果我們沒有進行任何配置,那么默認情況下系統(tǒng)只開啟了一級緩存,一級緩存就是同一個SqlSession執(zhí)行的相同查詢是會進行緩存的,OK,那么今天我們就來看看這些緩存,并簡單驗證下。
公司主營業(yè)務:網(wǎng)站設計、網(wǎng)站制作、移動網(wǎng)站開發(fā)等業(yè)務。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)是一支青春激揚、勤奮敬業(yè)、活力青春激揚、勤奮敬業(yè)、活力澎湃、和諧高效的團隊。公司秉承以“開放、自由、嚴謹、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領域給我們帶來的挑戰(zhàn),讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)推出黃陂免費做網(wǎng)站回饋大家。
系統(tǒng)默認開啟了一級緩存
這個緩存系統(tǒng)默認情況下是開啟的,當我們獲取到一個SqlSession對象之后,如果調(diào)用SqlSession中的同一個方法查詢同一條數(shù)據(jù),那么第二次查詢將不會去數(shù)據(jù)庫中查詢,因為第一次查詢有緩存,直接調(diào)用緩存數(shù)據(jù)即可,除非緩存超時或者我們明確聲明數(shù)據(jù)要刷新,否則都是直接調(diào)用緩存數(shù)據(jù)。OK,我們來看一個簡單的案例。
查詢代碼如下:
SqlSession sqlSession = null; try { sqlSession = DBUtils.openSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); //查詢同一條數(shù)據(jù)時會緩存 User user = mapper.getUser(1l); User user2 = mapper.getUser(1l); System.out.println(user.toString()); System.out.println(user2.toString()); sqlSession.commit(); } catch (Exception e) { System.err.println(e.getMessage()); sqlSession.rollback(); } finally { if (sqlSession != null) { sqlSession.close(); } }
我們來看看日志:
小伙伴們看到,我這里執(zhí)行了兩次查詢,但實際上只執(zhí)行了一次SQL語句。
自己配置二級緩存
上面的緩存是由系統(tǒng)默認配置的,這個有一定的局限性,就是只能在同一個SqlSession中有效,脫離了同一個SqlSession就沒法使用這個緩存了,有的時候我們可能希望能夠跨SqlSession進行數(shù)據(jù)緩存。那么這個時候需要我們進行手動開啟二級緩存。
二級緩存的開啟方式其實很簡單,只需要我們在userMapper.xml中配置
<?xml version="1.0" encoding="UTF-8" ?>INSERT INTO user(username,password,address) VALUES (#{username},#{password},#{address}) DELETE FROM user where id=#{id}
這樣簡單配置之后,二級緩存就算開啟了,這樣的配置中,許多東西都是默認的,比如所有的select語句都會被緩存,所有的delete、insert和update則都會將緩存刷新,還比如緩存將使用LRU算法進行內(nèi)存回收等。那么這些東西如果需要配置的話,我們可以按如下方式進行配置:
OK,做了如上配置之后還不夠,開啟二級緩存還要求我們的實體類可以序列化,實現(xiàn)Serializable接口即可,如下:
public class User implements Serializable{ private Long id; private String username; private String password; private String address; ... }
如此之后,我們的二級緩存就算成功開啟了,OK,我么來測試下:
SqlSession sqlSession = null; SqlSession sqlSession2 = null; try { sqlSession = DBUtils.openSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); User user = mapper.getUser(1l); System.out.println(user.toString()); sqlSession.commit(); sqlSession2 = DBUtils.openSqlSession(); UserMapper mapper2 = sqlSession2.getMapper(UserMapper.class); User user2 = mapper2.getUser(1l); System.out.println(user2.toString()); sqlSession2.commit(); } catch (Exception e) { System.err.println(e.getMessage()); sqlSession.rollback(); sqlSession2.rollback(); } finally { if (sqlSession != null) { sqlSession.close(); } if (sqlSession2 != null) { sqlSession2.close(); } }
打印日志如下:
OK,小伙伴們看到SQL語句實際上只執(zhí)行了一次。
OK,以上就是對mybatis中緩存的一個簡單介紹。
本文案例下載: 本文案例GitHub地址https://github.com/lenve/JavaEETest/tree/master/Test27-mybatis8
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。