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

Spring Boot 菜單刪除實現(xiàn)代碼與事務管理

 更新時間:2025年08月13日 10:19:51   作者:小白的代碼日記  
本文將詳細介紹Spring Boot環(huán)境下菜單刪除功能的實現(xiàn)邏輯,包括關聯(lián)數(shù)據(jù)處理、事務控制和異常處理等關鍵環(huán)節(jié),強調(diào)需處理多級嵌套、角色關聯(lián)及數(shù)據(jù)一致性,感興趣的朋友跟隨小編一起看看吧

在后臺管理系統(tǒng)開發(fā)中,菜單管理是一個核心功能,而刪除菜單作為其中的重要操作,需要考慮數(shù)據(jù)完整性、關聯(lián)關系處理和操作安全性。本文將詳細介紹 Spring Boot 環(huán)境下菜單刪除功能的實現(xiàn)邏輯,包括關聯(lián)數(shù)據(jù)處理、事務控制和異常處理等關鍵環(huán)節(jié)。

菜單刪除的業(yè)務邏輯分析

菜單刪除并非簡單地刪除一條記錄,需要考慮以下幾點:

  • 菜單可能存在多級嵌套關系(父菜單與子菜單)
  • 菜單與角色存在多對多關聯(lián)(通過中間表 role_menu)
  • 操作需要具備原子性(要么全部成功,要么全部失?。?/li>

因此,完整的菜單刪除邏輯應該是:先刪除關聯(lián)數(shù)據(jù),再刪除子菜單,最后刪除父菜單本身,并通過事務保證整個過程的完整性。

實現(xiàn)代碼與步驟解析

1. 控制器層(MenuController)

首先定義刪除接口,接收菜單 ID 并添加事務注解:

@RestController
@RequestMapping("/menu")
public class MenuController {
    @Autowired
    private MenuService menuService;
    @Autowired
    private RoleMenuMapper roleMenuMapper;
    /**
     * 刪除菜單
     * @param id 菜單ID
     * @return 操作結果
     */
    @DeleteMapping("/del/{id}")
    @Transactional  // 事務注解,確保操作原子性
    public Result deleteMenu(@PathVariable Integer id) {
        try {
            // 1. 查詢所有子菜單
            QueryWrapper<MenuEntity> subMenuQuery = new QueryWrapper<>();
            subMenuQuery.eq("parent_id", id);
            List<MenuEntity> subMenus = menuService.list(subMenuQuery);
            // 2. 先刪除子菜單與角色的關聯(lián)關系
            if (!subMenus.isEmpty()) {
                for (MenuEntity subMenu : subMenus) {
                    QueryWrapper<RoleMenuEntity> roleMenuQuery = new QueryWrapper<>();
                    roleMenuQuery.eq("menu_id", subMenu.getMenuId());
                    roleMenuMapper.delete(roleMenuQuery);
                }
                // 3. 刪除子菜單
                menuService.remove(subMenuQuery);
            }
            // 4. 刪除當前菜單與角色的關聯(lián)關系
            QueryWrapper<RoleMenuEntity> parentRoleMenuQuery = new QueryWrapper<>();
            parentRoleMenuQuery.eq("menu_id", id);
            roleMenuMapper.delete(parentRoleMenuQuery);
            // 5. 刪除當前菜單
            boolean isDeleted = menuService.removeById(id);
            if (isDeleted) {
                return Result.success("菜單刪除成功");
            } else {
                return Result.error("菜單不存在或已被刪除");
            }
        } catch (Exception e) {
            // 拋出運行時異常,觸發(fā)事務回滾
            throw new RuntimeException("刪除菜單失?。? + e.getMessage());
        }
    }
}

2. 關鍵步驟解析

步驟 1:查詢子菜單

通過 parent_id 查詢當前菜單的所有子菜單,為后續(xù)級聯(lián)刪除做準備:

QueryWrapper<MenuEntity> subMenuQuery = new QueryWrapper<>();
subMenuQuery.eq("parent_id", id);
List<MenuEntity> subMenus = menuService.list(subMenuQuery);

步驟 2:刪除子菜單與角色的關聯(lián)關系

由于菜單與角色通過中間表 role_menu 關聯(lián),需要先刪除這些關聯(lián)數(shù)據(jù),避免外鍵約束錯誤:

for (MenuEntity subMenu : subMenus) {
    QueryWrapper<RoleMenuEntity> roleMenuQuery = new QueryWrapper<>();
    roleMenuQuery.eq("menu_id", subMenu.getMenuId());
    roleMenuMapper.delete(roleMenuQuery);
}

步驟 3:刪除子菜單

在刪除關聯(lián)數(shù)據(jù)后,批量刪除所有子菜單:

menuService.remove(subMenuQuery);

步驟 4:刪除當前菜單與角色的關聯(lián)關系

同樣需要解除當前菜單與角色的關聯(lián):

QueryWrapper<RoleMenuEntity> parentRoleMenuQuery = new QueryWrapper<>();
parentRoleMenuQuery.eq("menu_id", id);
roleMenuMapper.delete(parentRoleMenuQuery);

步驟 5:刪除當前菜單

最后刪除主菜單記錄:

menuService.removeById(id);

事務管理與異常處理

  • 事務保證:通過@Transactional注解,確保整個刪除過程的原子性。如果任何步驟失敗,所有操作都會回滾,避免數(shù)據(jù)不一致。
  • 異常處理
    • 使用 try-catch 塊捕獲可能的異常
    • 拋出RuntimeException觸發(fā)事務回滾(符合 Spring 事務默認回滾規(guī)則)
    • 提供清晰的錯誤信息,便于問題排查
  • 刪除順序原則
    • 先刪關聯(lián)數(shù)據(jù),再刪主數(shù)據(jù)
    • 先刪子菜單,再刪父菜單
    • 遵循 "從外向內(nèi)、從下到上" 的刪除順序,避免外鍵約束沖突

到此這篇關于Spring Boot 菜單刪除功能的實現(xiàn)與事務管理的文章就介紹到這了,更多相關Spring Boot 菜單刪除內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • JAVA加密算法數(shù)字簽名實現(xiàn)原理詳解

    JAVA加密算法數(shù)字簽名實現(xiàn)原理詳解

    這篇文章主要介紹了JAVA加密算法數(shù)字簽名實現(xiàn)原理詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-10-10
  • Java整數(shù)和字符串相互轉(zhuǎn)化實例詳解

    Java整數(shù)和字符串相互轉(zhuǎn)化實例詳解

    這篇文章主要介紹了Java整數(shù)和字符串相互轉(zhuǎn)化實例詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-02-02
  • Java中Collection和Collections的區(qū)別

    Java中Collection和Collections的區(qū)別

    Collection是一個集合接口,集合類的頂級接口,Collections是一個包裝類,本文主要介紹了Java中Collection和Collections的區(qū)別,具有一定的參考價值,感興趣的可以了解一下
    2024-04-04
  • Java內(nèi)部類的繼承(全)

    Java內(nèi)部類的繼承(全)

    這篇文章主要介紹了Java內(nèi)部類的繼承,大家都知道JAVA內(nèi)部類的構造器必須連接指向其外圍類對象的引用,所以在繼承內(nèi)部類的時候,需要在導出類的構造器中手動加入對基類構造器的調(diào)用,需要的朋友可以參考下
    2015-07-07
  • Spring?Boot整合郵箱發(fā)送郵件實例

    Spring?Boot整合郵箱發(fā)送郵件實例

    大家好,本篇文章主要講的是Spring?Boot整合郵箱發(fā)送郵件實例,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-02-02
  • java讀取txt文件并輸出結果

    java讀取txt文件并輸出結果

    這篇文章主要介紹了java讀取txt文件并輸出結果,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-11-11
  • 解決jackson反序列化失敗InvalidFormatException:Can not deserialize value of type java.util.Date

    解決jackson反序列化失敗InvalidFormatException:Can not dese

    這篇文章主要介紹了解決jackson反序列化失敗InvalidFormatException:Can not deserialize value of type java.util.Date問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Java轉(zhuǎn)換流(InputStreamReader/OutputStreamWriter)的使用

    Java轉(zhuǎn)換流(InputStreamReader/OutputStreamWriter)的使用

    本文主要介紹了Java轉(zhuǎn)換流(InputStreamReader/OutputStreamWriter)的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-01-01
  • MybatisPlus如何自動生成映射文件

    MybatisPlus如何自動生成映射文件

    這篇文章主要介紹了MybatisPlus如何自動生成映射文件,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Spring MVC項目中l(wèi)og4J和AOP使用詳解

    Spring MVC項目中l(wèi)og4J和AOP使用詳解

    項目日志記錄是項目開發(fā)、運營必不可少的內(nèi)容,有了它可以對系統(tǒng)有整體的把控,出現(xiàn)任何問題都有蹤跡可尋。下面這篇文章主要給大家介紹了關于Spring MVC項目中l(wèi)og4J和AOP使用的相關資料,需要的朋友可以參考下。
    2017-12-12

最新評論

灵寿县| 彭泽县| 上蔡县| 鲁山县| 广安市| 搜索| 云龙县| 靖西县| 泰安市| 三门县| 鹤岗市| 古丈县| 图木舒克市| 东乡| 那曲县| 固镇县| 乐山市| 丰台区| 南城县| 扎囊县| 杨浦区| 阳城县| 体育| 武山县| 萝北县| 武乡县| 黄浦区| 朝阳区| 广汉市| 姚安县| 寻乌县| 巴林左旗| 固阳县| 青海省| 同仁县| 东台市| 麻栗坡县| 基隆市| 博兴县| 扎囊县| 峨山|