本文源碼:GitHub·點這裏 || GitEE·點這裏java
MVC模式與代碼分層策略,MVC全名是ModelViewController即模型-視圖-控制器,做爲一種軟件設計典範,用一種業務邏輯、數據、界面顯示分離的方法組織代碼,將業務邏輯彙集到一個部件裏面,在改進和個性化定製界面及用戶交互的同時,不須要從新編寫業務邏輯,這是一種開發模式,但並非實際開發中代碼的分層模式,一般SSM框架的後端代碼分層以下:git
一、Rest接口風格github
基於資源訪問和處理的邏輯,使用不一樣風格的註解。例如資源新增,更新,查詢,刪除。算法
/** * 新增 */ @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" ; }
二、接口複用度spring
不建議接口高度複用,例如增刪改查都各自對接接口便可,基本原則,不一樣的客戶端端操做,對於獨立的接口。數據庫
/** * 列表加載 */ @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機制,並且搜索的判斷條件很複雜,建議分爲兩個接口,從實際考慮,大部分場景下都是隻使用list接口,不多使用search搜索。編程
三、入參出參後端
校驗客戶端必須條件,例如某某條件必填必選等,若是有問題,快速阻斷請求鏈路,作到程序入口控制層攔截返回。設計模式
@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); }
參數在三個如下,能夠直接陳列入參,參數在三個或三個以上可使用實體類統一封裝。服務器
@PostMapping("/search") public List<BaseInfo> search (@RequestParam("userName") String userName, @RequestParam("phone") String phone) { return baseInfoService.search(userName,phone) ; }
四、參數處理
出參格式處理度基本原則,服務器做爲公共資源,避免非必要操做,例如客戶端可自行判斷返回值是否爲空,null等,或者一些常見格式處理,利用客戶端適當分擔服務器壓力。
一、業務校驗
例如傳入訂單號,通過數據庫層查詢,沒有訂單數據,這裏稱爲業務性質的異常,代碼自己沒有問題,可是業務邏輯沒法正常執行。
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+"數據缺失 DetailInfo"); } return buildModel(baseInfo,detailInfoEntity) ; } LOG.info("id="+id+"數據徹底缺失"); return null ; }
二、組裝業務邏輯
一般狀況下服務層做爲邏輯作複雜的一塊,用來拼接業務核心步驟,能夠經過業務邏輯斷定,一步一步執行程序,避免在程序入口作大量可能用到的對象建立和需求數據查詢。
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; }
三、數據模型構建
一般狀況業務層是偏複雜的,若是想關快速理解業務層,能夠對複雜的業務方法,在提供一個返參構建的方法,用來處理服務層要向控制層回傳的參數,這樣可讓重度的服務層方法變的清晰。
private InfoModel buildModel (BaseInfo baseInfo,DetailInfoEntity detailInfo){ InfoModel infoModel = new InfoModel() ; infoModel.setBaseInfo(baseInfo); infoModel.setDetailInfoEntity(detailInfo); return infoModel ; }
一、逆向工程
這裏以使用mybatis框架或者mybatis-plus框架做爲參考。若是是mybatis框架,建議逆向工程的模板代碼不作自定義的修改,若是須要自定義方法,在mapper和xml層面再自定義一個擴展文件,用來存放自定義的方法和SQL邏輯,這樣避免表結構變更大引起的強烈不適。
固然如今大部分都會mybatis-plus做爲持久層組件,能夠避免上述問題。
二、數據交互
針對業務層的須要,提供相應的數據查詢方法,只處理與數據庫交互的邏輯,避免出現業務邏輯,尤爲在分佈式架構下,不一樣服務的數據查詢和組裝,不該該出如今該層。
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
推薦閱讀:編程體系整理
序號 | 項目名稱 | GitHub地址 | GitEE地址 | 推薦指數 |
---|---|---|---|---|
01 | Java描述設計模式,算法,數據結構 | GitHub·點這裏 | GitEE·點這裏 | ☆☆☆☆☆ |
02 | Java基礎、併發、面向對象、Web開發 | GitHub·點這裏 | GitEE·點這裏 | ☆☆☆☆ |
03 | SpringCloud微服務基礎組件案例詳解 | GitHub·點這裏 | GitEE·點這裏 | ☆☆☆ |
04 | SpringCloud微服務架構實戰綜合案例 | GitHub·點這裏 | GitEE·點這裏 | ☆☆☆☆☆ |
05 | SpringBoot框架基礎應用入門到進階 | GitHub·點這裏 | GitEE·點這裏 | ☆☆☆☆ |
06 | SpringBoot框架整合開發經常使用中間件 | GitHub·點這裏 | GitEE·點這裏 | ☆☆☆☆☆ |
07 | 數據管理、分佈式、架構設計基礎案例 | GitHub·點這裏 | GitEE·點這裏 | ☆☆☆☆☆ |
08 | 大數據系列、存儲、組件、計算等框架 | GitHub·點這裏 | GitEE·點這裏 | ☆☆☆☆☆ |