Mybatis plus的自動(dòng)填充與樂(lè)觀鎖的實(shí)例詳解(springboot)
自動(dòng)填充
項(xiàng)目中經(jīng)常會(huì)遇到一些數(shù)據(jù),每次都使用相同的方式填充,如插入時(shí)間、更新時(shí)間。Mybatis-plus的自動(dòng)填充功能可以幫助我們快速實(shí)現(xiàn)。
1.表中加入create_time,update_time字段
2.實(shí)體類(lèi)注解填充字段
@TableField(fill= FieldFill.INSERT) private Date createTime; @TableField(fill = FieldFill.INSERT_UPDATE) private Date updateTime;
/**
* 默認(rèn)不處理
/
DEFAULT,
/*
* 插入填充字段
/
INSERT,
/*
* 更新填充字段
/
UPDATE,
/*
* 插入和更新填充字段
*/
INSERT_UPDATE
3.自定義實(shí)現(xiàn)類(lèi)MyMetaObjectHandler
@Component public class MyMetaObjectHandler implements MetaObjectHandler { /** * * 使用Mybatis-plus執(zhí)行insert操作這個(gè)方法執(zhí)行 */ @Override public void insertFill(MetaObject metaObject) { this.setFieldValByName("createTime",new Date(),metaObject); this.setFieldValByName("updateTime",new Date(),metaObject); } /** * * 使用Mybatis-plus執(zhí)行update操作這個(gè)方法執(zhí)行 */ @Override public void updateFill(MetaObject metaObject) { this.setFieldValByName("updateTime",new Date(),metaObject); } }
setFieldValByName中有三個(gè)參數(shù),第一個(gè)是字段名,第二個(gè)是要填充的數(shù)據(jù),第三個(gè)參數(shù)寫(xiě)成metaObject就可以。
測(cè)試插入:
測(cè)試修改:
發(fā)現(xiàn)插入數(shù)據(jù)的時(shí)候會(huì)自動(dòng)將這兩個(gè)數(shù)據(jù)填充當(dāng)前時(shí)間,更新的時(shí)候會(huì)只講更新時(shí)間更改為當(dāng)前時(shí)間。
樂(lè)觀鎖
當(dāng)項(xiàng)目中出現(xiàn)并發(fā)操作時(shí),會(huì)出現(xiàn)丟失更新問(wèn)題,即A與B都查詢到money字段為100,A修改money+900,改為1000。這時(shí)B也提交修改,money+50,改為150。A的修改就丟失了。
解決這種情況有兩種方法:悲觀鎖和樂(lè)觀鎖,悲觀鎖就是只能一個(gè)一個(gè)操作,A操作的時(shí)候B只能等著,等A提交完成了B才能查詢。
Mybatis-plus自帶樂(lè)觀鎖:創(chuàng)建一個(gè)version字段,當(dāng)A與B可以同時(shí)操作,當(dāng)A提交的時(shí)候會(huì)看當(dāng)前版本號(hào)與查詢時(shí)候的版本號(hào)是否一致,一致才能提交成功,否則提交失敗,提交成功會(huì)把當(dāng)前版本號(hào)+1。
1.數(shù)據(jù)庫(kù)中加入version字段,并在實(shí)體類(lèi)中加入version屬性。
加上 @Version
注解
@Version private Integer version;
2.編寫(xiě)配置類(lèi)引入樂(lè)觀鎖插件
@Configuration @MapperScan("com.zyw.mpdemo.mapper") public class MpConfig { @Bean public OptimisticLockerInterceptor optimisticLockerInterceptor() { return new OptimisticLockerInterceptor(); } }
3.編寫(xiě)測(cè)試
用兩個(gè)對(duì)象查詢同一個(gè)id,做不同的修改,然后依次提交。
@Override public void test(Account account) { Account account1 = accountMapper.selectById(1326188266440888321L); Account account2 = accountMapper.selectById(1326188266440888321L); account1.setMoney(account.getMoney()); account2.setMoney(account.getMoney()+100); accountMapper.updateById(account1); accountMapper.updateById(account2); }
第一次成功,第二次提交失敗,因?yàn)榈诙翁峤坏臅r(shí)候的版本號(hào)與查詢到的不一致。
到此這篇關(guān)于Mybatis plus的自動(dòng)填充與樂(lè)觀鎖(springboot)的文章就介紹到這了,更多相關(guān)Mybatis plus自動(dòng)填充樂(lè)觀鎖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java中泛型學(xué)習(xí)之細(xì)節(jié)篇
泛型在java中有很重要的地位,在面向?qū)ο缶幊碳案鞣N設(shè)計(jì)模式中有非常廣泛的應(yīng)用,下面這篇文章主要給大家介紹了關(guān)于Java中泛型細(xì)節(jié)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-02-02Springboot如何連接遠(yuǎn)程服務(wù)器上的數(shù)據(jù)庫(kù)實(shí)踐
本文主要介紹了Springboot如何連接遠(yuǎn)程服務(wù)器上的數(shù)據(jù)庫(kù)實(shí)踐,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04SpringSecurity?認(rèn)證實(shí)現(xiàn)流程分析
SpringSecurity框架通過(guò)一個(gè)過(guò)濾器鏈來(lái)處理認(rèn)證和授權(quán),主要包括UsernamePasswordAuthenticationFilter負(fù)責(zé)處理登錄請(qǐng)求,本文給大家介紹SpringSecurity?認(rèn)證實(shí)現(xiàn)登錄校驗(yàn),感興趣的朋友跟隨小編一起看看吧2024-10-10Mybatis查詢返回兩個(gè)或多個(gè)參數(shù)問(wèn)題
這篇文章主要介紹了Mybatis查詢返回兩個(gè)或多個(gè)參數(shù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06java數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)雙向鏈表功能
這篇文章主要為大家詳細(xì)介紹了java數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)雙向鏈表功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11Java實(shí)現(xiàn)對(duì)中文字符串的排序功能實(shí)例代碼
這篇文章主要介紹了Java實(shí)現(xiàn)中文字符串的排序功能實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2016-04-04