编码风格:Mvc模式下SSM环境,代码分层管理
本文源碼:GitHub·點這里 || GitEE·點這里
一、分層策略
MVC模式與代碼分層策略,MVC全名是ModelViewController即模型-視圖-控制器,作為一種軟件設(shè)計典范,用一種業(yè)務(wù)邏輯、數(shù)據(jù)、界面顯示分離的方法組織代碼,將業(yè)務(wù)邏輯聚集到一個部件里面,在改進和個性化定制界面及用戶交互的同時,不需要重新編寫業(yè)務(wù)邏輯,這是一種開發(fā)模式,但并不是實際開發(fā)中代碼的分層模式,通常SSM框架的后端代碼分層如下:
- controller控制層:定義服務(wù)端接口,入?yún)⒊鰠?#xff0c;和一些入?yún)⑿r?#xff1b;
- service業(yè)務(wù)服務(wù)層:組裝業(yè)務(wù)邏輯,業(yè)務(wù)校驗,構(gòu)建控制層需要的參數(shù)模型;
- dao數(shù)據(jù)交互層:提供服務(wù)層需要的數(shù)據(jù)查詢方法,處理數(shù)據(jù)交互條件相關(guān)的邏輯;
- mapper持久層:基于mybatis框架需要的原生支持,目前很常用的持久層組件;
二、控制層
1、Rest接口風格
基于資源訪問和處理的邏輯,使用不同風格的注解。例如資源新增,更新,查詢,刪除。
/*** 新增*/ @PostMapping("/insert") public Integer insert (@RequestBody BaseInfo baseInfo){return baseInfoService.insert(baseInfo); } /*** 更新*/ @PutMapping("/update/{id}") public String update(@PathVariable(value = "id") Integer id,@RequestBody BaseInfo baseInfo) {if (id<1){return "error";}baseInfo.setId(id);return "update="+baseInfoService.update(baseInfo); } /*** 主鍵查詢*/ @GetMapping("/detail/{id}") public InfoModel detail(@PathVariable(value = "id") Integer id) {return baseInfoService.detail(id) ; } /*** 主鍵刪除*/ @DeleteMapping("/delete/{id}") public String delete(@PathVariable(value = "id") Integer id) {baseInfoService.delete(id) ;return "SUS" ; }2、接口復(fù)用度
不建議接口高度復(fù)用,例如增刪改查都各自對接接口即可,基本原則,不同的客戶端端操作,對于獨立的接口。
/*** 列表加載*/ @GetMapping("/list") public List<BaseInfo> list() {return baseInfoService.list(new BaseInfoExample()) ; } /*** 列表搜索*/ @PostMapping("/search") public List<BaseInfo> search (@RequestParam("userName") String userName,@RequestParam("phone") String phone) {return baseInfoService.search(userName,phone) ; }例如常見的list接口,list通常都有會按條件加載的search機制,而且搜索的判斷條件很復(fù)雜,建議分為兩個接口,從實際考慮,大部分場景下都是只使用list接口,很少使用search搜索。
3、入?yún)⒊鰠?/strong>
校驗客戶端必須條件,例如某某條件必填必選等,如果有問題,快速阻斷請求鏈路,做到程序入口控制層攔截返回。
@PutMapping("/update/{id}") public String update(@PathVariable(value = "id") Integer id,@RequestBody BaseInfo baseInfo) {if (id<1){return "error";}baseInfo.setId(id);return "update="+baseInfoService.update(baseInfo); }參數(shù)在三個以下,可以直接陳列入?yún)?#xff0c;參數(shù)在三個或三個以上可以使用實體類統(tǒng)一封裝。
@PostMapping("/search") public List<BaseInfo> search (@RequestParam("userName") String userName,@RequestParam("phone") String phone) {return baseInfoService.search(userName,phone) ; }4、參數(shù)處理
出參格式處理度基本原則,服務(wù)器作為公共資源,避免非必要操作,例如客戶端可自行判斷返回值是否為空,null等,或者一些常見格式處理,利用客戶端適當分擔服務(wù)器壓力。
三、業(yè)務(wù)服務(wù)層
1、業(yè)務(wù)校驗
例如傳入訂單號,經(jīng)過數(shù)據(jù)庫層查詢,沒有訂單數(shù)據(jù),這里稱為業(yè)務(wù)性質(zhì)的異常,代碼本身沒有問題,但是業(yè)務(wù)邏輯無法正常執(zhí)行。
public InfoModel detail(Integer id){BaseInfo baseInfo = baseInfoDao.selectByPrimaryKey(id) ;if (baseInfo != null){DetailInfoEntity detailInfoEntity = detailInfoDao.getById(id);if (detailInfoEntity == null){LOG.info("id="+id+"數(shù)據(jù)缺失 DetailInfo");}return buildModel(baseInfo,detailInfoEntity) ;}LOG.info("id="+id+"數(shù)據(jù)完全缺失");return null ; }2、組裝業(yè)務(wù)邏輯
通常情況下服務(wù)層作為邏輯做復(fù)雜的一塊,用來拼接業(yè)務(wù)核心步驟,可以通過業(yè)務(wù)邏輯判定,一步一步執(zhí)行程序,避免在程序入口做大量可能用到的對象創(chuàng)建和需求數(shù)據(jù)查詢。
public int insert (BaseInfo record){record.setCreateTime(new Date());int insertFlag = baseInfoDao.insert(record);if (insertFlag > 0){DetailInfoEntity detailInfoEntity = new DetailInfoEntity();detailInfoEntity.setUserId(record.getId());detailInfoEntity.setCreateTime(record.getCreateTime());if(detailInfoDao.save(detailInfoEntity)){return insertFlag ;}}return insertFlag; }3、數(shù)據(jù)模型構(gòu)建
通常情況業(yè)務(wù)層是偏復(fù)雜的,如果想關(guān)快速理解業(yè)務(wù)層,可以對復(fù)雜的業(yè)務(wù)方法,在提供一個返參構(gòu)建的方法,用來處理服務(wù)層要向控制層回傳的參數(shù),這樣可以讓重度的服務(wù)層方法變的清晰。
private InfoModel buildModel (BaseInfo baseInfo,DetailInfoEntity detailInfo){InfoModel infoModel = new InfoModel() ;infoModel.setBaseInfo(baseInfo);infoModel.setDetailInfoEntity(detailInfo);return infoModel ; }四、數(shù)據(jù)交互層
1、逆向工程
這里以使用mybatis框架或者mybatis-plus框架作為參考。如果是mybatis框架,建議逆向工程的模板代碼不做自定義的修改,如果需要自定義方法,在mapper和xml層面再自定義一個擴展文件,用來存放自定義的方法和SQL邏輯,這樣避免表結(jié)構(gòu)變動大引發(fā)的強烈不適。
當然現(xiàn)在大部分都會mybatis-plus作為持久層組件,可以避免上述問題。
2、數(shù)據(jù)交互
針對業(yè)務(wù)層的需要,提供相應(yīng)的數(shù)據(jù)查詢方法,只處理與數(shù)據(jù)庫交互的邏輯,避免出現(xiàn)業(yè)務(wù)邏輯,尤其在分布式架構(gòu)下,不同服務(wù)的數(shù)據(jù)查詢和組裝,不應(yīng)該出現(xiàn)在該層。
public interface BaseInfoDao {int insert(BaseInfo record);List<BaseInfo> selectByExample(BaseInfoExample example);int updateByPrimaryKey(BaseInfo record);BaseInfo selectByPrimaryKey(Integer id);int deleteByPrimaryKey(Integer id);BaseInfo getById (Integer id) ; }五、源代碼地址
GitHub·地址 https://github.com/cicadasmile/data-manage-parent GitEE·地址 https://gitee.com/cicadasmile/data-manage-parent推薦閱讀:編程體系整理
| 01 | Java描述設(shè)計模式,算法,數(shù)據(jù)結(jié)構(gòu) | GitHub·點這里 | GitEE·點這里 | ☆☆☆☆☆ |
| 02 | Java基礎(chǔ)、并發(fā)、面向?qū)ο?、Web開發(fā) | GitHub·點這里 | GitEE·點這里 | ☆☆☆☆ |
| 03 | SpringCloud微服務(wù)基礎(chǔ)組件案例詳解 | GitHub·點這里 | GitEE·點這里 | ☆☆☆ |
| 04 | SpringCloud微服務(wù)架構(gòu)實戰(zhàn)綜合案例 | GitHub·點這里 | GitEE·點這里 | ☆☆☆☆☆ |
| 05 | SpringBoot框架基礎(chǔ)應(yīng)用入門到進階 | GitHub·點這里 | GitEE·點這里 | ☆☆☆☆ |
| 06 | SpringBoot框架整合開發(fā)常用中間件 | GitHub·點這里 | GitEE·點這里 | ☆☆☆☆☆ |
| 07 | 數(shù)據(jù)管理、分布式、架構(gòu)設(shè)計基礎(chǔ)案例 | GitHub·點這里 | GitEE·點這里 | ☆☆☆☆☆ |
| 08 | 大數(shù)據(jù)系列、存儲、組件、計算等框架 | GitHub·點這里 | GitEE·點這里 | ☆☆☆☆☆ |
總結(jié)
以上是生活随笔為你收集整理的编码风格:Mvc模式下SSM环境,代码分层管理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: stone 的 log4j配置详解
- 下一篇: 获取程序启动路径