最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MyBatis-Plus高級擴展詳解

 更新時間:2025年03月11日 10:10:47   作者:一個懵懂的菜鳥  
本文介紹了MyBatis-Plus中邏輯刪除和樂觀鎖的實現(xiàn)概念、方法和示例,邏輯刪除通過更改記錄狀態(tài)模擬刪除,而樂觀鎖通過版本號或時間戳確保并發(fā)操作的正確性

MyBatis-Plus高級擴展

邏輯刪除實現(xiàn)

概念:

邏輯刪除,可以方便地實現(xiàn)對數(shù)據(jù)庫記錄的邏輯刪除而不是物理刪除。邏輯刪除是指通過更改記錄的狀態(tài)或添加標記字段來模擬刪除操作,從而保留了刪除前的數(shù)據(jù),便于后續(xù)的數(shù)據(jù)分析和恢復(fù)。

  • 物理刪除:真實刪除,將對應(yīng)數(shù)據(jù)從數(shù)據(jù)庫中刪除,之后查詢不到此條被刪除的數(shù)據(jù)
  • 邏輯刪除:假刪除,將對應(yīng)數(shù)據(jù)中代表是否被刪除字段的狀態(tài)修改為“被刪除狀態(tài)”,之后在數(shù)據(jù)庫中仍舊能看到此條數(shù)據(jù)記錄

邏輯刪除實現(xiàn):

  • 數(shù)據(jù)庫和實體類添加邏輯刪除字段
  • 表添加邏輯刪除字段可以是一個布爾類型、整數(shù)類型或枚舉類型。
ALTER TABLE USER ADD deleted INT DEFAULT 0 ;  # int 類型 1 邏輯刪除 0 未邏輯刪除
  • 實體類添加邏輯刪除屬性
@Data
public class User {

   // @TableId
    private Integer id;
    private String name;
    private Integer age;
    private String email;
    
    @TableLogic
    //邏輯刪除字段 int mybatis-plus下,默認 邏輯刪除值為1 未邏輯刪除 0 
    private Integer deleted;
}
  • 指定邏輯刪除字段和屬性值

單一指定

@Data
public class User {

   // @TableId
    private Integer id;
    private String name;
    private Integer age;
    private String email;
     @TableLogic
    //邏輯刪除字段 int mybatis-plus下,默認 邏輯刪除值為1 未邏輯刪除 1 
    private Integer deleted;
}

全局指定

mybatis-plus:
  global-config:
    db-config:
      logic-delete-field: deleted # 全局邏輯刪除的實體字段名(since 3.3.0,配置后可以忽略不配置步驟2)
      logic-delete-value: 1 # 邏輯已刪除值(默認為 1)
      logic-not-delete-value: 0 # 邏輯未刪除值(默認為 0)
  • 演示邏輯刪除操作

邏輯刪除以后,沒有真正的刪除語句,刪除改為修改語句!刪除代碼:

//邏輯刪除
@Test
public void testQuick5(){
    //邏輯刪除
    userMapper.deleteById(5);
}

執(zhí)行效果:

JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@5871a482] will not be managed by Spring ==> Preparing: UPDATE user SET deleted=1 WHERE id=? AND deleted=0 ==> Parameters: 5(Integer) <== Updates: 1

  • 測試查詢數(shù)據(jù)
@Test
public void testQuick6(){
    //正常查詢.默認查詢非邏輯刪除數(shù)據(jù)
    userMapper.selectList(null);
}

//SELECT id,name,age,email,deleted FROM user WHERE deleted=0

樂觀鎖實現(xiàn)

悲觀鎖和樂觀鎖場景和介紹

并發(fā)問題場景演示:

**解決思路: **

樂觀鎖和悲觀鎖是在并發(fā)編程中用于處理并發(fā)訪問和資源競爭的兩種不同的鎖機制?。?/p>

悲觀鎖:

  • 悲觀鎖的基本思想是,在整個數(shù)據(jù)訪問過程中,將共享資源鎖定,以確保其他線程或進程不能同時訪問和修改該資源。悲觀鎖的核心思想是"先保護,再修改"。
  • 在悲觀鎖的應(yīng)用中,線程在訪問共享資源之前會獲取到鎖,并在整個操作過程中保持鎖的狀態(tài),阻塞其他線程的訪問。
  • 只有當(dāng)前線程完成操作后,才會釋放鎖,讓其他線程繼續(xù)操作資源。
  • 這種鎖機制可以確保資源獨占性和數(shù)據(jù)的一致性,但是在高并發(fā)環(huán)境下,悲觀鎖的效率相對較低。

樂觀鎖:

  • 樂觀鎖的基本思想是,認為并發(fā)沖突的概率較低,因此不需要提前加鎖,而是在數(shù)據(jù)更新階段進行沖突檢測和處理。樂觀鎖的核心思想是"先修改,后校驗"。
  • 在樂觀鎖的應(yīng)用中,線程在讀取共享資源時不會加鎖,而是記錄特定的版本信息。
  • 當(dāng)線程準備更新資源時,會先檢查該資源的版本信息是否與之前讀取的版本信息一致,如果一致則執(zhí)行更新操作,否則說明有其他線程修改了該資源,需要進行相應(yīng)的沖突處理。
  • 樂觀鎖通過避免加鎖操作,提高了系統(tǒng)的并發(fā)性能和吞吐量,但是在并發(fā)沖突較為頻繁的情況下,樂觀鎖會導(dǎo)致較多的沖突處理和重試操作。

理解點:悲觀鎖和樂觀鎖是兩種解決并發(fā)數(shù)據(jù)問題的思路,不是具體技術(shù)!!!

具體技術(shù)和方案:

(1)樂觀鎖實現(xiàn)方案和技術(shù):

  • 版本號/時間戳:為數(shù)據(jù)添加一個版本號或時間戳字段,每次更新數(shù)據(jù)時,比較當(dāng)前版本號或時間戳與期望值是否一致,若一致則更新成功,否則表示數(shù)據(jù)已被修改,需要進行沖突處理。
  • CAS(Compare-and-Swap):使用原子操作比較當(dāng)前值與舊值是否一致,若一致則進行更新操作,否則重新嘗試。
  • 無鎖數(shù)據(jù)結(jié)構(gòu):采用無鎖數(shù)據(jù)結(jié)構(gòu),如無鎖隊列、無鎖哈希表等,通過使用原子操作實現(xiàn)并發(fā)安全。

(2)悲觀鎖實現(xiàn)方案和技術(shù):

  • 鎖機制:使用傳統(tǒng)的鎖機制,如互斥鎖(Mutex Lock)或讀寫鎖(Read-Write Lock)來保證對共享資源的獨占訪問。
  • 數(shù)據(jù)庫鎖:在數(shù)據(jù)庫層面使用行級鎖或表級鎖來控制并發(fā)訪問。
  • 信號量(Semaphore):使用信號量來限制對資源的并發(fā)訪問。

介紹版本號樂觀鎖技術(shù)的實現(xiàn)流程:

  • 每條數(shù)據(jù)添加一個版本號字段version
  • 取出記錄時,獲取當(dāng)前 version
  • 更新時,檢查獲取版本號是不是數(shù)據(jù)庫當(dāng)前最新版本號
  • 如果是[證明沒有人修改數(shù)據(jù)], 執(zhí)行更新, set 數(shù)據(jù)更新 , version = version+ 1
  • 如果 version 不對[證明有人已經(jīng)修改了],我們現(xiàn)在的其他記錄就是失效數(shù)據(jù)!就更新失敗

使用mybatis-plus數(shù)據(jù)使用樂觀鎖

  • 添加版本號更新插件
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
    MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
    interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
    return interceptor;
}
  • 樂觀鎖字段添加@Version注解。注意:數(shù)據(jù)庫也需要添加version字段
ALTER TABLE USER ADD VERSION INT DEFAULT 1 ;  # int 類型 樂觀鎖字段
  • 支持的數(shù)據(jù)類型只有:int,Integer,long,Long,Date,Timestamp,LocalDateTime
  • 僅支持 updateById(id) 與 update(entity, wrapper) 方法
@Version
private Integer version;
  • 正常更新使用即可
//演示樂觀鎖生效場景
@Test
public void testQuick7(){
    //步驟1: 先查詢,在更新 獲取version數(shù)據(jù)
    //同時查詢兩條,但是version唯一,最后更新的失敗
    User user  = userMapper.selectById(5);
    User user1  = userMapper.selectById(5);

    user.setAge(20);
    user1.setAge(30);

    userMapper.updateById(user);
    //樂觀鎖生效,失敗!
    userMapper.updateById(user1);
}

防全表更新和刪除實現(xiàn)

針對 update 和 delete 語句 作用:阻止惡意的全表更新刪除

  • 添加防止全表更新和刪除攔截器
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
  MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
  interceptor.addInnerInterceptor(new BlockAttackInnerInterceptor());
  return interceptor;
}
}
  • 測試全部更新或者刪除
@Test
public void testQuick8(){
    User user = new User();
    user.setName("custom_name");
    user.setEmail("xxx@mail.com");
    //Caused by: com.baomidou.mybatisplus.core.exceptions.MybatisPlusException: Prohibition of table update operation
    //全局更新,報錯
    userService.saveOrUpdate(user,null);
}

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 解決BufferedReader.readLine()遇見的坑

    解決BufferedReader.readLine()遇見的坑

    這篇文章主要介紹了解決BufferedReader.readLine()遇見的坑,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • java多線程文件下載器的實現(xiàn)

    java多線程文件下載器的實現(xiàn)

    本文主要介紹了java多線程文件下載器的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-11-11
  • SpringBoot?隱式參數(shù)注入詳解告別重復(fù)代碼,讓?Controller?更優(yōu)雅

    SpringBoot?隱式參數(shù)注入詳解告別重復(fù)代碼,讓?Controller?更優(yōu)雅

    本文介紹了使用SpringBoot的HandlerMethodArgumentResolver實現(xiàn)隱式參數(shù)注入的技巧,通過自定義注解和解析器,可以簡化Controller中的重復(fù)參數(shù)處理邏輯,提升代碼的可維護性和可讀性,感興趣的朋友跟隨小編一起看看吧
    2026-03-03
  • java實現(xiàn)Redisson的基本使用

    java實現(xiàn)Redisson的基本使用

    Redisson是一個在Redis的基礎(chǔ)上實現(xiàn)的Java駐內(nèi)存數(shù)據(jù)網(wǎng)格客戶端,本文主要介紹了java實現(xiàn)Redisson的基本使用,具有一定的參考價值,感興趣的可以了解一下
    2023-12-12
  • Java面向?qū)ο蠡A(chǔ)之多態(tài)性,抽象類和接口

    Java面向?qū)ο蠡A(chǔ)之多態(tài)性,抽象類和接口

    這篇文章主要介紹了Java面向?qū)ο蠡A(chǔ):多態(tài)性,抽象類和接口,文中代碼可以幫助各位更好的理解學(xué)習(xí),有需求的小伙伴可以參考下
    2020-05-05
  • Java動態(tài)編譯與類加載實戰(zhàn)詳解

    Java動態(tài)編譯與類加載實戰(zhàn)詳解

    本文詳細介紹Java Compiler?API、類加載機制、反射、代理、Instrumentation、OSGi、Spring?BeanDefinition、熱部署工具及安全策略等關(guān)鍵技術(shù),并結(jié)合實際項目幫助開發(fā)者掌握動態(tài)類處理的完整流程與最佳實踐,感興趣的朋友跟隨小編一起看看吧
    2025-09-09
  • java實現(xiàn)文件和base64相互轉(zhuǎn)換

    java實現(xiàn)文件和base64相互轉(zhuǎn)換

    這篇文章主要為大家詳細介紹了java如何實現(xiàn)文件和base64相互轉(zhuǎn)換,文中的示例代碼講解詳細,具有一定的參考價值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-11-11
  • Spring?Security密碼解析器PasswordEncoder自定義登錄邏輯

    Spring?Security密碼解析器PasswordEncoder自定義登錄邏輯

    這篇文章主要為大家介紹了Spring?Security密碼解析器PasswordEncoder自定義登錄邏輯示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • 如何解決使用restTemplate進行feign調(diào)用new HttpEntity<>報錯問題

    如何解決使用restTemplate進行feign調(diào)用new HttpEntity<>報錯問題

    這篇文章主要介紹了如何解決使用restTemplate進行feign調(diào)用new HttpEntity<>報錯問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • springboot中如何使用minio存儲容器

    springboot中如何使用minio存儲容器

    大家好,本篇文章主要講的是springboot中如何使用minio存儲容器,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-02-02

最新評論

正阳县| 西乌珠穆沁旗| 资中县| 门源| 河津市| 左云县| 哈尔滨市| 蓬溪县| 罗平县| 清河县| 盖州市| 凤山市| 札达县| 石狮市| 福州市| 南陵县| 亳州市| 西宁市| 潼南县| 额济纳旗| 井研县| 济南市| 宿迁市| 宣化县| 新宁县| 乐平市| 滨海县| 晋宁县| 东海县| 乐平市| 托里县| 铜山县| 云霄县| 琼中| 绿春县| 驻马店市| 成都市| 鲁甸县| 开鲁县| 昔阳县| 闽侯县|