SpringBoot + Mybatis-plus實戰(zhàn)之Mybatis-plus的一級緩存、二級緩存
前言
現(xiàn)在的JAVA行業(yè),貌似已經(jīng)是SpringBoot + SpringCloud 的天下了,早期的SSH,SSM框架已經(jīng)老去,與SpringBoot相結(jié)合的JPA框架雖然省去了很多的增刪改查sql,但是比較笨拙,在面對一些復(fù)雜多變的邏輯時常常力不從心,而相對應(yīng)的Mybatis由于其高度的靈活性受到廣大JAVA攻城獅的歡迎。之前整合過了springboot+mybatis,前幾天看到一個面試的問一個問題,Mybatis的一級緩存,二級緩存。我想這個應(yīng)該也是一個重點吧,所以今天決定來詳細解讀一下神秘的一二級緩存。
- 一級緩存是SqlSession級別的緩存。在操作數(shù)據(jù)庫時需要構(gòu)造sqlSession對象,在對象中有一個數(shù)據(jù)結(jié)構(gòu)(HashMap)用于存儲緩存數(shù)據(jù)。不同的sqlSession之間的緩存數(shù)據(jù)區(qū)域(HashMap)是互相不影響的。 一級緩存是默認開啟的不用配置。
- 二級緩存是mapper級別的緩存,多個SqlSession去操作同一個Mapper的sql語句,多個SqlSession可以共用二級緩存,二級緩存是跨SqlSession的。二級緩存的開啟(實體類必須序列化),然后在配置文件里面配置。
MyBatis-plus 配置要點
核心要點1
mybatis-plus 在springboot 中的核心配置如下
mybatis-plus.configuration.cache-enabled=true mybatis-plus.mapper-locations=classpath*:/mapper/*.xml mybatis-plus.type-aliases-package=com.sch.app.mybatis.entity logging.level.com.sch.app.mybatis.mapper= debug
所需依賴 除了基本的springboot依賴外,還有
核心要點2
<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.3.2</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency>
核心要點3
mybatis 語句生成 generatorConfig.xml 用它一步生成需要的基本實體類和接口以及mapper文件(resouses目錄下)
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"> <generatorConfiguration> <!-- <properties resource="mybatis.properties" /> --> <classPathEntry location="D:\AJava\mysql-connector-java-8.0.16.jar" /> <context id="msqlTables" targetRuntime="MyBatis3"> <plugin type="org.mybatis.generator.plugins.SerializablePlugin"></plugin> <jdbcConnection connectionURL="jdbc:mysql://localhost:3306/alexshi?serverTimezone=GMT%2B8" driverClass="com.mysql.cj.jdbc.Driver" password="1234" userId="root" > <property name="nullCatalogMeansCurrent" value="true"/> </jdbcConnection> <javaTypeResolver> <property name="forceBigDecimals" value="false" /> </javaTypeResolver> <javaModelGenerator targetPackage="com.sch.app.mybatis.entity" targetProject="SpringbootMybatis\src\main\java"> <property name="enableSubPackages" value="true"/> <!-- 從數(shù)據(jù)庫返回的值被清理前后的空格 --> <property name="trimStrings" value="true" /> </javaModelGenerator> <sqlMapGenerator targetPackage="mapper" targetProject="SpringbootMybatis\src\main\resources"> <property name="enableSubPackages" value="true"/> </sqlMapGenerator> <javaClientGenerator type="XMLMAPPER" targetPackage="com.sch.app.mybatis.mapper" targetProject="SpringbootMybatis\src\main\java"> <property name="enableSubPackages" value="true"/> </javaClientGenerator> <!--數(shù)據(jù)庫表--> <table schema="" tableName="d_dictionary"></table> <table schema="" tableName="d_dictionary_type"></table> <table schema="" tableName="c_resource"></table> <table schema="" tableName="c_role"></table> <table schema="" tableName="c_role_resource"></table> <table schema="" tableName="c_user_online"></table> <table schema="" tableName="c_user"></table> <table schema="" tableName="c_user_role"></table> <table schema="" tableName="test"></table> </context> </generatorConfiguration>
這個 Run Mybatis Generator 可以在eclipse 的插件市場下的
點擊執(zhí)行后生成以下內(nèi)容
Mybatis-plus 一級緩存的測試
首先一定要開啟日志 方便查看效果
logging.level.com.sch.app.mybatis.mapper= debug
com.sch.app.mybatis.mapper 也就是 mapper接口的目錄
測試代碼1
@Autowired private SqlSessionFactory sqlSessionFactory; @RequestMapping(value = "/testMybatis") @ResponseBody public void testMybatis(){ SqlSession sqlSession = sqlSessionFactory.openSession(); TestMapper testMapper = sqlSession.getMapper(TestMapper.class); for (int i = 0; i < 3; i++) { Test selectByPrimaryKey = testMapper.selectByPrimaryKey(5); log.info("結(jié)果:"+ selectByPrimaryKey.getUsername()); }
結(jié)果是
可以看出,只搜索了一次,第二三次都沒有sql打印
測試代碼2
@RequestMapping(value = "/testMybatis") @ResponseBody public void testMybatis(){ SqlSession sqlSession = sqlSessionFactory.openSession(); TestMapper testMapper = sqlSession.getMapper(TestMapper.class); for (int i = 0; i < 3; i++) { Test selectByPrimaryKey = testMapper.selectByPrimaryKey(5); log.info("結(jié)果:"+ selectByPrimaryKey.getUsername()); if (i == 2) { selectByPrimaryKey.setUsername("劉惜君的妹妹"); testMapper.updateByPrimaryKey(selectByPrimaryKey); Test selectByPrimaryKey2 = testMapper.selectByPrimaryKey(5); log.info("更新后的用戶名:"+ selectByPrimaryKey2.getUsername()); } }
打印結(jié)果:
可見,第一次我加入了更新的代碼后再次查詢的時候,就又執(zhí)行了sql語句,說明當(dāng)執(zhí)行插入、更新、刪除,會清空SqlSession中的一級緩存。只有查詢的操作,一級緩存才不會被清除。
Mybatis-plus二級緩存測試
二級緩存的開啟除了在配置文件中打開開關(guān) 還要在mapper對應(yīng)開啟
測試代碼1
@RequestMapping(value = "/testMybatis2") @ResponseBody public void testMybatis2(){ SqlSession openSession1 = sqlSessionFactory.openSession(); SqlSession openSession2 = sqlSessionFactory.openSession(); TestMapper mapper1 = openSession1.getMapper(TestMapper.class); TestMapper mapper2 = openSession2.getMapper(TestMapper.class); Test selectByPrimaryKey = mapper1.selectByPrimaryKey(5); System.out.println(selectByPrimaryKey.getUsername()); openSession1.close(); Test selectByPrimaryKey2 = mapper2.selectByPrimaryKey(5); System.out.println(selectByPrimaryKey2.getUsername()); openSession2.close(); }
測試結(jié)果
由測試結(jié)果可知,上述代碼第一次查 mapper1.selectByPrimaryKey(5) 的時候執(zhí)行了sql,然后關(guān)閉了第一個session 第二次 用別的sqlseeison 去查沒有調(diào)用sql,說明了二級換粗和sqlseesion 無關(guān),之和mapper有關(guān)。
測試代碼2
@RequestMapping(value = "/testMybatis3") @ResponseBody public void testMybatis3(){ SqlSession openSession1 = sqlSessionFactory.openSession(); SqlSession openSession2 = sqlSessionFactory.openSession(); SqlSession openSession3 = sqlSessionFactory.openSession(); TestMapper mapper1 = openSession1.getMapper(TestMapper.class); TestMapper mapper2 = openSession2.getMapper(TestMapper.class); TestMapper mapper3 = openSession3.getMapper(TestMapper.class); Test selectByPrimaryKey = mapper1.selectByPrimaryKey(5); System.out.println(selectByPrimaryKey.getUsername()); openSession1.close(); selectByPrimaryKey.setUsername("劉惜君的姐姐"); mapper2.updateByPrimaryKey(selectByPrimaryKey); openSession2.commit(); Test selectByPrimaryKey3 = mapper3.selectByPrimaryKey(5); System.out.println(selectByPrimaryKey3.getUsername()); openSession3.close(); }
打印結(jié)果
由此可知,做了更新mapper2.updateByPrimaryKey(selectByPrimaryKey); 之后, 二級緩存才被清空。特性和一級緩存很類似。
初次之外,我們可以通過userCache是來設(shè)置具體的語句是否禁用二級緩存
重新執(zhí)行 http://localhost:8080/testMybatis2 后的打印結(jié)果
可見 selectByPrimaryKey 這個查詢禁止二級緩存后,兩次都從數(shù)據(jù)庫里面查了。
小結(jié)
- 一級緩存是默認開始的,屬于會話級別,一個會話做多次做相同查詢會開啟,如果對查詢的數(shù)據(jù)進行更新,刪除等操作時,再次查詢會從數(shù)據(jù)庫里查而不用一級緩存。
- 二級緩存開啟最重要,請記住三點,1.配置文件開啟mybatis-plus.configuration.cache-enabled=true,2.對應(yīng)mapper文件開啟 3.對應(yīng)實體類實現(xiàn)Serializable 接口。如果要對某一個sql語句禁用二級緩存,則需要在具體的xml 的sql語句定義處加上 useCache=“false” 。另外記住它和會話無關(guān),和 xml 的 namespace 即具體的mapper 有關(guān)。
- 在mapper的同一個namespace中,如果有其它insert、update、delete操作數(shù)據(jù)后需要刷新緩存,如果不執(zhí)行刷新緩存會出現(xiàn)臟讀。
- 設(shè)置statement配置中的flushCache=“true” 屬性,可以實現(xiàn)二級緩存的刷新,false則可能出現(xiàn)臟讀。openSession.clearCache() 可以實現(xiàn)對一級緩存的刷新。
到此這篇關(guān)于SpringBoot + Mybatis-plus實戰(zhàn)之Mybatis-plus的一級緩存、二級緩存的文章就介紹到這了,更多相關(guān)Mybatis-plus一級緩存、二級緩存內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Jenkins Pipeline自動化構(gòu)建發(fā)布Java項目的方法
這篇文章主要介紹了使用Jenkins Pipeline自動化構(gòu)建發(fā)布Java項目的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-04-04springBoot整合jwt實現(xiàn)token令牌認證的示例代碼
實施Token驗證的方法挺多的,還有一些標(biāo)準(zhǔn)方法,比如JWT,本文主要介紹了springBoot整合jwt實現(xiàn)token令牌認證的示例代碼,具有一定的參考價值,感興趣的可以了解一下2024-08-08SpringBoot調(diào)用公共模塊的自定義注解失效的解決
這篇文章主要介紹了SpringBoot調(diào)用公共模塊的自定義注解失效的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02jdk中動態(tài)代理異常處理分析:UndeclaredThrowableException
最近在工作中遇到了報UndeclaredThrowableException的錯誤,通過查找相關(guān)的資料,終于解決了,所以這篇文章主要給大家介紹了關(guān)于jdk中動態(tài)代理異常處理分析:UndeclaredThrowableException的相關(guān)資料,需要的朋友可以參考下2018-04-04如何解決java.util.zip.ZipFile解壓后被java占用問題
這篇文章主要介紹了如何解決java.util.zip.ZipFile解壓后被java占用問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-06-06