javascript
SpringBoot+MySql实现一对多再多对多的数据库的设计以及业务层增删改查的实现
場(chǎng)景
SpringBoot+MySql+ElementUI實(shí)現(xiàn)一對(duì)多的數(shù)據(jù)庫(kù)的設(shè)計(jì)以及增刪改查的實(shí)現(xiàn)
https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/107971394
上面講了app應(yīng)用對(duì)應(yīng)權(quán)限實(shí)現(xiàn)一對(duì)多的邏輯。
如果一對(duì)多多的那層再是一對(duì)多的話要怎樣設(shè)計(jì)。
比如白名單設(shè)計(jì),一個(gè)白名單可以包含多個(gè)手機(jī)app,而每個(gè)app又對(duì)應(yīng)多個(gè)權(quán)限。
注:
博客:
https://blog.csdn.net/badao_liumang_qizhi
關(guān)注公眾號(hào)
霸道的程序猿
獲取編程相關(guān)電子書(shū)、教程推送與免費(fèi)下載。
實(shí)現(xiàn)
首先設(shè)計(jì)白名單表
?
主要靠白名單的編碼實(shí)現(xiàn)與應(yīng)用的一對(duì)多關(guān)聯(lián)。
添加白名單數(shù)據(jù)
?
然后設(shè)計(jì)與白名單一對(duì)多的app表
?
添加幾條數(shù)據(jù)
?
然后設(shè)計(jì)權(quán)限表
?
然后添加幾條權(quán)限表數(shù)據(jù)
?
然后怎樣將這三個(gè)表進(jìn)行關(guān)聯(lián),其中用到了兩個(gè)關(guān)聯(lián)表,首先是白名單與app應(yīng)用實(shí)現(xiàn)一對(duì)多的關(guān)聯(lián)
設(shè)計(jì)關(guān)聯(lián)表
?
通過(guò)白名單的編碼與app表的id進(jìn)行關(guān)聯(lián)
添加幾條關(guān)聯(lián)數(shù)據(jù)
?
然后是實(shí)現(xiàn)應(yīng)用表與權(quán)限表的一對(duì)多關(guān)聯(lián),設(shè)計(jì)關(guān)聯(lián)表
?
其實(shí)這里的設(shè)計(jì)可以只實(shí)現(xiàn)appid與權(quán)限id的關(guān)聯(lián),這樣的話就是用到兩個(gè)關(guān)聯(lián)表。
或者只用上面這一張關(guān)聯(lián)表實(shí)現(xiàn)白名單-應(yīng)用-權(quán)限的關(guān)聯(lián)。
具體根據(jù)自己情況選擇,這里為了避免數(shù)據(jù)錯(cuò)亂所以使用了兩個(gè)關(guān)聯(lián)表并且第二個(gè)關(guān)聯(lián)表也設(shè)計(jì)如上,
添加幾條關(guān)聯(lián)表數(shù)據(jù)
?
這樣關(guān)聯(lián)就代表白名單編號(hào)為001的對(duì)應(yīng)app的id為1和2的,而appid為1的又對(duì)應(yīng)權(quán)限id為1和2的。
然后使用代碼生成工具分別生成以上所有表的相關(guān)的代碼。
然后在實(shí)體類中添加關(guān)聯(lián)關(guān)系。
即白名單實(shí)體類中添加應(yīng)用的list,構(gòu)建出一對(duì)多的關(guān)系,在應(yīng)用的實(shí)體類中添加權(quán)限的list,構(gòu)建出一對(duì)多的關(guān)系。
白名單實(shí)體
public class YckzBaimingdan {private static final long serialVersionUID = 1L;/** id */private Long id;/** 白名單編號(hào) */private String bmdbh;/** 白名單名稱 */private String bmdname;/** 創(chuàng)建日期 */@JsonFormat(pattern = "yyyy-MM-dd")private Date cjrq;/** 創(chuàng)建人 */private String cjr;/**** 白名單中應(yīng)用列表*/private List<YckzBaimingdanApp> appList; }省略get和set方法
應(yīng)用實(shí)體
public class YckzBaimingdanApp {private static final long serialVersionUID = 1L;/** id */private Long id;/** 白名單編號(hào) */private String bmdbh;/** app應(yīng)用id */private Long appid;/**** 名稱*/private String name;/**** 包名*/private String packagename;/**** 權(quán)限列表*/private List<YckzBaimingdanQuanxian> quanxianList; }省略get和set方法
然后在新增白名單的接口方法中
??? public AjaxResult add(@RequestBody YckzBaimingdan yckzBaimingdan){//驗(yàn)證白名單編號(hào)是否存在int count = yckzBaimingdanService.isExistYckzBaimingdan(yckzBaimingdan.getBmdbh());if(count>0){return AjaxResult.error("該編號(hào)已經(jīng)存在");}else{//插入白名單表yckzBaimingdan.setCjrq(new Date());yckzBaimingdanService.insertYckzBaimingdan(yckzBaimingdan);//插入白名單-應(yīng)用表//必須有應(yīng)用列表List<YckzBaimingdanApp> appList = yckzBaimingdan.getAppList();for (YckzBaimingdanApp app:appList) {app.setBmdbh(yckzBaimingdan.getBmdbh());//必須有白名單編號(hào)和appidyckzBaimingdanAppService.insertYckzBaimingdanApp(app);//每個(gè)應(yīng)用必須有權(quán)限列表List<YckzBaimingdanQuanxian> quanxianList = app.getQuanxianList();for (YckzBaimingdanQuanxian quanxian:quanxianList) {quanxian.setBaimingdanbh(yckzBaimingdan.getBmdbh());quanxian.setAppid(app.getAppid());//插入白名單-權(quán)限表yckzBaimingdanQuanxianService.insertYckzBaimingdanQuanxian(quanxian);}}return AjaxResult.success("新增白名單成功");}}首先驗(yàn)證白名單編號(hào)唯一,然后插入到白名單表中數(shù)據(jù),然后獲取應(yīng)用表的list,循環(huán)插入白名單的
編號(hào)和應(yīng)用的id,應(yīng)用id是前端通過(guò)請(qǐng)求應(yīng)用表數(shù)據(jù)獲取的id。然后在獲取每個(gè)應(yīng)用對(duì)應(yīng)的權(quán)限的list
再循環(huán)插入白名單-應(yīng)用-權(quán)限的關(guān)聯(lián)表。
這樣新增時(shí)只是新增一個(gè)或者兩個(gè)關(guān)聯(lián)表。
然后在進(jìn)行獲取白名單的詳細(xì)信息時(shí)
??? public AjaxResult getInfo(@PathVariable("id") Long id){//查詢出白名單主表YckzBaimingdan baimingdan = yckzBaimingdanService.selectYckzBaimingdanById(id);//查詢出應(yīng)用列表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);}根據(jù)id獲取白名單表的信息,再根據(jù)白名單的編號(hào)獲取應(yīng)用的list再循環(huán)應(yīng)用list,根據(jù)白名單編號(hào)和應(yīng)用id獲取權(quán)限的list,再分別將其賦值給對(duì)應(yīng)的主表的list,然后
將白名單主表對(duì)象返回。
在實(shí)現(xiàn)修改時(shí)
??? public AjaxResult edit(@RequestBody YckzBaimingdan yckzBaimingdan){//修改白名單-應(yīng)用表//必須有應(yīng)用列表List<YckzBaimingdanApp> appList = yckzBaimingdan.getAppList();for (YckzBaimingdanApp app:appList) {//每個(gè)應(yīng)用必須有權(quán)限列表List<YckzBaimingdanQuanxian> quanxianList = app.getQuanxianList();for (YckzBaimingdanQuanxian quanxian:quanxianList) {quanxian.setBaimingdanbh(yckzBaimingdan.getBmdbh());quanxian.setAppid(app.getAppid());//修改白名單-權(quán)限表yckzBaimingdanQuanxianService.updateYckzBaimingdanQuanxian(quanxian);}app.setBmdbh(yckzBaimingdan.getBmdbh());//必須有白名單編號(hào)和appidyckzBaimingdanAppService.updateYckzBaimingdanApp(app);}//修改白名單表yckzBaimingdanService.updateYckzBaimingdan(yckzBaimingdan);return AjaxResult.success("修改白名單成功");}首先獲取白名單下的應(yīng)用列表然后循環(huán)獲取每一個(gè)下的權(quán)限列表,然后在循環(huán)中
先修改權(quán)限表,循環(huán)完之后再修改應(yīng)用表,再循環(huán)接受后修改白名單表。
更新時(shí)要采用逆序即從里向外的順序進(jìn)行修改,先修改多的那端再修改一的那端。
不然將一的那端修改后找不到對(duì)應(yīng)的多的那端的信息了。
修改的是兩個(gè)關(guān)聯(lián)表的數(shù)據(jù),不用修改應(yīng)用信息表和權(quán)限信息表。
然后在刪除時(shí)跟修改類似也是逆序的方式
??? public AjaxResult remove(@PathVariable Long[] ids){for (Long id:ids) {//查詢主表YckzBaimingdan baimingdan = yckzBaimingdanService.selectYckzBaimingdanById(id);//查詢出應(yīng)用列表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);//獲取應(yīng)用列表List<YckzBaimingdanApp> appList = baimingdan.getAppList();for (YckzBaimingdanApp app:appList) {//每個(gè)應(yīng)用必須有權(quán)限列表List<YckzBaimingdanQuanxian> quanxianList = app.getQuanxianList();for (YckzBaimingdanQuanxian quanxian:quanxianList) {quanxian.setBaimingdanbh(baimingdan.getBmdbh());quanxian.setAppid(app.getAppid());//刪除白名單-權(quán)限表yckzBaimingdanQuanxianService.deleteYckzBaimingdanQuanxianById(quanxian.getId());}app.setBmdbh(baimingdan.getBmdbh());yckzBaimingdanAppService.deleteYckzBaimingdanAppById(app.getId());}yckzBaimingdanService.deleteYckzBaimingdanById(baimingdan.getId());}return AjaxResult.success("刪除白名單成功");}?
總結(jié)
以上是生活随笔為你收集整理的SpringBoot+MySql实现一对多再多对多的数据库的设计以及业务层增删改查的实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: SpringBoot+MySql+Ele
- 下一篇: ElementUI中el-table双击