本文源码: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·点这里 | ☆☆☆☆☆ |