Spring Boot 菜單刪除實現(xiàn)代碼與事務管理
在后臺管理系統(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ù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
- SpringBoot中TransactionTemplate事務管理的實現(xiàn)
- SpringBoot使用JTA實現(xiàn)對多數(shù)據(jù)源的事務管理
- springboot中事務管理@Transactional的注意事項與使用場景
- 詳解Springboot事務管理
- Spring boot jpa 刪除數(shù)據(jù)和事務管理的問題實例詳解
- 詳解SpringBoot的事務管理
- Spring Boot多數(shù)據(jù)源及其事務管理配置方法
- SpringBoot+layuimini實現(xiàn)左側菜單動態(tài)展示的示例代碼
- SpringBoot+Vue實現(xiàn)動態(tài)菜單的思路梳理
- Spring?Boot?+?Mybatis?Plus實現(xiàn)樹狀菜單的方法
相關文章
Java整數(shù)和字符串相互轉(zhuǎn)化實例詳解
這篇文章主要介紹了Java整數(shù)和字符串相互轉(zhuǎn)化實例詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-02-02
Java中Collection和Collections的區(qū)別
Collection是一個集合接口,集合類的頂級接口,Collections是一個包裝類,本文主要介紹了Java中Collection和Collections的區(qū)別,具有一定的參考價值,感興趣的可以了解一下2024-04-04
解決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)的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-01-01
Spring MVC項目中l(wèi)og4J和AOP使用詳解
項目日志記錄是項目開發(fā)、運營必不可少的內(nèi)容,有了它可以對系統(tǒng)有整體的把控,出現(xiàn)任何問題都有蹤跡可尋。下面這篇文章主要給大家介紹了關于Spring MVC項目中l(wèi)og4J和AOP使用的相關資料,需要的朋友可以參考下。2017-12-12

