亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

SpringBoot + Mybatis-plus實(shí)戰(zhàn)之Mybatis-plus的一級(jí)緩存、二級(jí)緩存

瀏覽:13日期:2023-04-05 15:59:24

前言

現(xiàn)在的JAVA行業(yè),貌似已經(jīng)是SpringBoot + SpringCloud 的天下了,早期的SSH,SSM框架已經(jīng)老去,與SpringBoot相結(jié)合的JPA框架雖然省去了很多的增刪改查sql,但是比較笨拙,在面對(duì)一些復(fù)雜多變的邏輯時(shí)常常力不從心,而相對(duì)應(yīng)的Mybatis由于其高度的靈活性受到廣大JAVA攻城獅的歡迎。之前整合過(guò)了springboot+mybatis,前幾天看到一個(gè)面試的問(wèn)一個(gè)問(wèn)題,Mybatis的一級(jí)緩存,二級(jí)緩存。我想這個(gè)應(yīng)該也是一個(gè)重點(diǎn)吧,所以今天決定來(lái)詳細(xì)解讀一下神秘的一二級(jí)緩存。

一級(jí)緩存是SqlSession級(jí)別的緩存。在操作數(shù)據(jù)庫(kù)時(shí)需要構(gòu)造sqlSession對(duì)象,在對(duì)象中有一個(gè)數(shù)據(jù)結(jié)構(gòu)(HashMap)用于存儲(chǔ)緩存數(shù)據(jù)。不同的sqlSession之間的緩存數(shù)據(jù)區(qū)域(HashMap)是互相不影響的。 一級(jí)緩存是默認(rèn)開(kāi)啟的不用配置。 二級(jí)緩存是mapper級(jí)別的緩存,多個(gè)SqlSession去操作同一個(gè)Mapper的sql語(yǔ)句,多個(gè)SqlSession可以共用二級(jí)緩存,二級(jí)緩存是跨SqlSession的。二級(jí)緩存的開(kāi)啟(實(shí)體類必須序列化),然后在配置文件里面配置。

MyBatis-plus 配置要點(diǎn)核心要點(diǎn)1

mybatis-plus 在springboot 中的核心配置如下

mybatis-plus.configuration.cache-enabled=truemybatis-plus.mapper-locations=classpath*:/mapper/*.xmlmybatis-plus.type-aliases-package=com.sch.app.mybatis.entitylogging.level.com.sch.app.mybatis.mapper= debug

所需依賴 除了基本的springboot依賴外,還有

核心要點(diǎn)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>

核心要點(diǎn)3

mybatis 語(yǔ)句生成 generatorConfig.xml 用它一步生成需要的基本實(shí)體類和接口以及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:AJavamysql-connector-java-8.0.16.jar' /> <context 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='SpringbootMybatissrcmainjava'> <property name='enableSubPackages' value='true'/> <!-- 從數(shù)據(jù)庫(kù)返回的值被清理前后的空格 --> <property name='trimStrings' value='true' /> </javaModelGenerator> <sqlMapGenerator targetPackage='mapper' targetProject='SpringbootMybatissrcmainresources'> <property name='enableSubPackages' value='true'/> </sqlMapGenerator> <javaClientGenerator type='XMLMAPPER' targetPackage='com.sch.app.mybatis.mapper' targetProject='SpringbootMybatissrcmainjava'> <property name='enableSubPackages' value='true'/> </javaClientGenerator> <!--數(shù)據(jù)庫(kù)表--> <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>

SpringBoot + Mybatis-plus實(shí)戰(zhàn)之Mybatis-plus的一級(jí)緩存、二級(jí)緩存

這個(gè) Run Mybatis Generator 可以在eclipse 的插件市場(chǎng)下的

點(diǎn)擊執(zhí)行后生成以下內(nèi)容

SpringBoot + Mybatis-plus實(shí)戰(zhàn)之Mybatis-plus的一級(jí)緩存、二級(jí)緩存

SpringBoot + Mybatis-plus實(shí)戰(zhàn)之Mybatis-plus的一級(jí)緩存、二級(jí)緩存

Mybatis-plus 一級(jí)緩存的測(cè)試

首先一定要開(kāi)啟日志 方便查看效果

logging.level.com.sch.app.mybatis.mapper= debug

com.sch.app.mybatis.mapper 也就是 mapper接口的目錄

SpringBoot + Mybatis-plus實(shí)戰(zhàn)之Mybatis-plus的一級(jí)緩存、二級(jí)緩存

測(cè)試代碼1

@Autowiredprivate 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()); }

SpringBoot + Mybatis-plus實(shí)戰(zhàn)之Mybatis-plus的一級(jí)緩存、二級(jí)緩存

結(jié)果是

SpringBoot + Mybatis-plus實(shí)戰(zhàn)之Mybatis-plus的一級(jí)緩存、二級(jí)緩存

可以看出,只搜索了一次,第二三次都沒(méi)有sql打印

測(cè)試代碼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é)果:

SpringBoot + Mybatis-plus實(shí)戰(zhàn)之Mybatis-plus的一級(jí)緩存、二級(jí)緩存

可見(jiàn),第一次我加入了更新的代碼后再次查詢的時(shí)候,就又執(zhí)行了sql語(yǔ)句,說(shuō)明當(dāng)執(zhí)行插入、更新、刪除,會(huì)清空SqlSession中的一級(jí)緩存。只有查詢的操作,一級(jí)緩存才不會(huì)被清除。

Mybatis-plus二級(jí)緩存測(cè)試

二級(jí)緩存的開(kāi)啟除了在配置文件中打開(kāi)開(kāi)關(guān) 還要在mapper對(duì)應(yīng)開(kāi)啟

SpringBoot + Mybatis-plus實(shí)戰(zhàn)之Mybatis-plus的一級(jí)緩存、二級(jí)緩存

測(cè)試代碼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(); }

測(cè)試結(jié)果

SpringBoot + Mybatis-plus實(shí)戰(zhàn)之Mybatis-plus的一級(jí)緩存、二級(jí)緩存

由測(cè)試結(jié)果可知,上述代碼第一次查 mapper1.selectByPrimaryKey(5) 的時(shí)候執(zhí)行了sql,然后關(guān)閉了第一個(gè)session 第二次 用別的sqlseeison 去查沒(méi)有調(diào)用sql,說(shuō)明了二級(jí)換粗和sqlseesion 無(wú)關(guān),之和mapper有關(guān)。

測(cè)試代碼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é)果

SpringBoot + Mybatis-plus實(shí)戰(zhàn)之Mybatis-plus的一級(jí)緩存、二級(jí)緩存

由此可知,做了更新mapper2.updateByPrimaryKey(selectByPrimaryKey); 之后, 二級(jí)緩存才被清空。特性和一級(jí)緩存很類似。

初次之外,我們可以通過(guò)userCache是來(lái)設(shè)置具體的語(yǔ)句是否禁用二級(jí)緩存

SpringBoot + Mybatis-plus實(shí)戰(zhàn)之Mybatis-plus的一級(jí)緩存、二級(jí)緩存

重新執(zhí)行 http://localhost:8080/testMybatis2 后的打印結(jié)果

SpringBoot + Mybatis-plus實(shí)戰(zhàn)之Mybatis-plus的一級(jí)緩存、二級(jí)緩存

可見(jiàn) selectByPrimaryKey 這個(gè)查詢禁止二級(jí)緩存后,兩次都從數(shù)據(jù)庫(kù)里面查了。

小結(jié)

一級(jí)緩存是默認(rèn)開(kāi)始的,屬于會(huì)話級(jí)別,一個(gè)會(huì)話做多次做相同查詢會(huì)開(kāi)啟,如果對(duì)查詢的數(shù)據(jù)進(jìn)行更新,刪除等操作時(shí),再次查詢會(huì)從數(shù)據(jù)庫(kù)里查而不用一級(jí)緩存。 二級(jí)緩存開(kāi)啟最重要,請(qǐng)記住三點(diǎn),1.配置文件開(kāi)啟mybatis-plus.configuration.cache-enabled=true,2.對(duì)應(yīng)mapper文件開(kāi)啟 3.對(duì)應(yīng)實(shí)體類實(shí)現(xiàn)Serializable 接口。如果要對(duì)某一個(gè)sql語(yǔ)句禁用二級(jí)緩存,則需要在具體的xml 的sql語(yǔ)句定義處加上 useCache=“false” 。另外記住它和會(huì)話無(wú)關(guān),和 xml 的 namespace 即具體的mapper 有關(guān)。 在mapper的同一個(gè)namespace中,如果有其它insert、update、delete操作數(shù)據(jù)后需要刷新緩存,如果不執(zhí)行刷新緩存會(huì)出現(xiàn)臟讀。 設(shè)置statement配置中的flushCache=“true” 屬性,可以實(shí)現(xiàn)二級(jí)緩存的刷新,false則可能出現(xiàn)臟讀。openSession.clearCache() 可以實(shí)現(xiàn)對(duì)一級(jí)緩存的刷新。

到此這篇關(guān)于SpringBoot + Mybatis-plus實(shí)戰(zhàn)之Mybatis-plus的一級(jí)緩存、二級(jí)緩存的文章就介紹到這了,更多相關(guān)Mybatis-plus一級(jí)緩存、二級(jí)緩存內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Spring
相關(guān)文章:
主站蜘蛛池模板: 精品视频在线观看一区二区三区 | 亚洲精品二区中文字幕 | 国产成人精品天堂 | 精品久久中文网址 | 亚洲性色综合图区图片 | 亚洲欧美在线制服丝袜国产 | 色婷婷视频 | 亚洲精品99久久久久中文字幕 | 欧美日韩亚洲高清不卡一区二区三区 | 成年美女黄网站色大免费视频 | 91在线免费视频观看 | 日韩精品欧美国产精品亚 | japanese国产在线中文 | 日韩精品专区 | 91官网 | blz在线成人免费视频 | 日韩中文字幕第一页 | 免费观看欧美精品成人毛片 | 国产黄的网站免费 | 欧美极品福利视频在线播放 | 最新国产美女一区二区三区 | 国产综合色在线视频区色吧图片 | 欧日韩视频 | 国内真实愉拍系列情侣自拍 | 国产精品玩偶在线观看 | 国产三级成人 | 日韩国产成人 | a级毛片在线免费观看 | 精品国产一区二区 | 国产伊人影院 | 精品视频专区 | 亚洲一区日韩二区欧美三区 | 五十路一区二区三区视频 | 国模午夜写真福利视频在线 | 欧美日韩在线观看视频 | 在线看成品视频入口免 | 欧美一级毛片欧美毛片视频 | 精品日本亚洲一区二区三区 | 国产视频播放 | 五月四房婷婷 | 美女免费视频一区二区 |