SpringBoot+MySql實現一對多再多對多的資料庫的設計以及業務層增刪改查的實現
場景
SpringBoot+MySql+ElementUI實現一對多的資料庫的設計以及增刪改查的實現
https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/107971394
上面講了app應用對應許可權實現一對多的邏輯。
如果一對多多的那層再是一對多的話要怎樣設計。
比如白名單設計,一個白名單可以包含多個手機app,而每個app又對應多個許可權。
注:
部落格:
https://blog.csdn.net/badao_liumang_qizhi
關注公眾號
霸道的程式猿
獲取程式設計相關電子書、教程推送與免費下載。
實現
首先設計白名單表
主要靠白名單的編碼實現與應用的一對多關聯。
新增白名單資料
然後設計與白名單一對多的app表
新增幾條資料
然後設計許可權表
然後新增幾條許可權表資料
然後怎樣將這三個表進行關聯,其中用到了兩個關聯表,首先是白名單與app應用實現一對多的關聯
設計關聯表
通過白名單的編碼與app表的id進行關聯
新增幾條關聯資料
然後是實現應用表與許可權表的一對多關聯,設計關聯表
其實這裡的設計可以只實現appid與許可權id的關聯,這樣的話就是用到兩個關聯表。
或者只用上面這一張關聯表實現白名單-應用-許可權的關聯。
具體根據自己情況選擇,這裡為了避免資料錯亂所以使用了兩個關聯表並且第二個關聯表也設計如上,
新增幾條關聯表資料
這樣關聯就代表白名單編號為001的對應app的id為1和2的,而appid為1的又對應許可權id為1和2的。
然後使用程式碼生成工具分別生成以上所有表的相關的程式碼。
然後在實體類中新增關聯關係。
即白名單實體類中新增應用的list,構建出一對多的關係,在應用的實體類中新增許可權的list,構建出一對多的關係。
白名單實體
public class YckzBaimingdan { private static final long serialVersionUID = 1L; /** id */ private Long id; /** 白名單編號 */ private String bmdbh; /** 白名單名稱 */ private String bmdname; /** 建立日期 */ @JsonFormat(pattern = "yyyy-MM-dd") private Date cjrq; /** 建立人 */ private String cjr; /*** * 白名單中應用列表 */ private List<YckzBaimingdanApp> appList; }
省略get和set方法
應用實體
public class YckzBaimingdanApp { private static final long serialVersionUID = 1L; /** id */ private Long id; /** 白名單編號 */ private String bmdbh; /** app應用id */ private Long appid; /*** * 名稱 */ private String name; /*** * 包名 */ private String packagename; /*** * 許可權列表 */ private List<YckzBaimingdanQuanxian> quanxianList; }
省略get和set方法
然後在新增白名單的介面方法中
public AjaxResult add(@RequestBody YckzBaimingdan yckzBaimingdan) { //驗證白名單編號是否存在 int count = yckzBaimingdanService.isExistYckzBaimingdan(yckzBaimingdan.getBmdbh()); if(count>0) { return AjaxResult.error("該編號已經存在"); } else{ //插入白名單表 yckzBaimingdan.setCjrq(new Date()); yckzBaimingdanService.insertYckzBaimingdan(yckzBaimingdan); //插入白名單-應用表 //必須有應用列表 List<YckzBaimingdanApp> appList = yckzBaimingdan.getAppList(); for (YckzBaimingdanApp app:appList) { app.setBmdbh(yckzBaimingdan.getBmdbh()); //必須有白名單編號和appid yckzBaimingdanAppService.insertYckzBaimingdanApp(app); //每個應用必須有許可權列表 List<YckzBaimingdanQuanxian> quanxianList = app.getQuanxianList(); for (YckzBaimingdanQuanxian quanxian:quanxianList) { quanxian.setBaimingdanbh(yckzBaimingdan.getBmdbh()); quanxian.setAppid(app.getAppid()); //插入白名單-許可權表 yckzBaimingdanQuanxianService.insertYckzBaimingdanQuanxian(quanxian); } } return AjaxResult.success("新增白名單成功"); } }
首先驗證白名單編號唯一,然後插入到白名單表中資料,然後獲取應用表的list,迴圈插入白名單的
編號和應用的id,應用id是前端通過請求應用表資料獲取的id。然後在獲取每個應用對應的許可權的list
再迴圈插入白名單-應用-許可權的關聯表。
這樣新增時只是新增一個或者兩個關聯表。
然後在進行獲取白名單的詳細資訊時
public AjaxResult getInfo(@PathVariable("id") Long id) { //查詢出白名單主表 YckzBaimingdan baimingdan = yckzBaimingdanService.selectYckzBaimingdanById(id); //查詢出應用列表 List<YckzBaimingdanApp> appList = yckzBaimingdanAppService.selectYckzBaimingdanAppListByBh(baimingdan.getBmdbh()); for (YckzBaimingdanApp app:appList) { List<YckzBaimingdanQuanxian> quanxianList = yckzBaimingdanQuanxianService.selectYckzBaimingdanQuanxianListByBhAndId(baimingdan.getBmdbh(), app.getAppid()); app.setQuanxianList(quanxianList); } baimingdan.setAppList(appList); return AjaxResult.success(baimingdan); }
根據id獲取白名單表的資訊,再根據白名單的編號獲取應用的list再迴圈應用list,根據白名單編號和應用id獲取許可權的list,再分別將其賦值給對應的主表的list,然後
將白名單主表物件返回。
在實現修改時
public AjaxResult edit(@RequestBody YckzBaimingdan yckzBaimingdan) { //修改白名單-應用表 //必須有應用列表 List<YckzBaimingdanApp> appList = yckzBaimingdan.getAppList(); for (YckzBaimingdanApp app:appList) { //每個應用必須有許可權列表 List<YckzBaimingdanQuanxian> quanxianList = app.getQuanxianList(); for (YckzBaimingdanQuanxian quanxian:quanxianList) { quanxian.setBaimingdanbh(yckzBaimingdan.getBmdbh()); quanxian.setAppid(app.getAppid()); //修改白名單-許可權表 yckzBaimingdanQuanxianService.updateYckzBaimingdanQuanxian(quanxian); } app.setBmdbh(yckzBaimingdan.getBmdbh()); //必須有白名單編號和appid yckzBaimingdanAppService.updateYckzBaimingdanApp(app); } //修改白名單表 yckzBaimingdanService.updateYckzBaimingdan(yckzBaimingdan); return AjaxResult.success("修改白名單成功"); }
首先獲取白名單下的應用列表然後迴圈獲取每一個下的許可權列表,然後在迴圈中
先修改許可權表,迴圈完之後再修改應用表,再迴圈接受後修改白名單表。
更新時要採用逆序即從裡向外的順序進行修改,先修改多的那端再修改一的那端。
不然將一的那端修改後找不到對應的多的那端的資訊了。
修改的是兩個關聯表的資料,不用修改應用資訊表和許可權資訊表。
然後在刪除時跟修改類似也是逆序的方式
public AjaxResult remove(@PathVariable Long[] ids) { for (Long id:ids) { //查詢主表 YckzBaimingdan baimingdan = yckzBaimingdanService.selectYckzBaimingdanById(id); //查詢出應用列表 List<YckzBaimingdanApp> appList1 = yckzBaimingdanAppService.selectYckzBaimingdanAppListByBh(baimingdan.getBmdbh()); for (YckzBaimingdanApp app:appList1) { List<YckzBaimingdanQuanxian> quanxianList = yckzBaimingdanQuanxianService.selectYckzBaimingdanQuanxianListByBhAndId(baimingdan.getBmdbh(), app.getAppid()); app.setQuanxianList(quanxianList); } baimingdan.setAppList(appList1); //獲取應用列表 List<YckzBaimingdanApp> appList = baimingdan.getAppList(); for (YckzBaimingdanApp app:appList) { //每個應用必須有許可權列表 List<YckzBaimingdanQuanxian> quanxianList = app.getQuanxianList(); for (YckzBaimingdanQuanxian quanxian:quanxianList) { quanxian.setBaimingdanbh(baimingdan.getBmdbh()); quanxian.setAppid(app.getAppid()); //刪除白名單-許可權表 yckzBaimingdanQuanxianService.deleteYckzBaimingdanQuanxianById(quanxian.getId()); } app.setBmdbh(baimingdan.getBmdbh()); yckzBaimingdanAppService.deleteYckzBaimingdanAppById(app.getId()); } yckzBaimingdanService.deleteYckzBaimingdanById(baimingdan.getId()); } return AjaxResult.success("刪除白名單成功"); }