本文源码:GitHub·点这里 || GitEE·点这里

一、分层策略

MVC模式与代码分层策略,MVC全名是ModelViewController即模型-视图-控制器,作为一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑,这是一种开发模式,但并不是实际开发中代码的分层模式,通常SSM框架的后端代码分层如下:

  • controller控制层:定义服务端接口,入参出参,和一些入参校验;
  • service业务服务层:组装业务逻辑,业务校验,构建控制层需要的参数模型;
  • dao数据交互层:提供服务层需要的数据查询方法,处理数据交互条件相关的逻辑;
  • 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、接口复用度

不建议接口高度复用,例如增删改查都各自对接接口即可,基本原则,不同的客户端端操作,对于独立的接口。

/*** 列表加载*/
@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搜索。

3、入参出参

校验客户端必须条件,例如某某条件必填必选等,如果有问题,快速阻断请求链路,做到程序入口控制层拦截返回。

@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) ;
}

4、参数处理

出参格式处理度基本原则,服务器作为公共资源,避免非必要操作,例如客户端可自行判断返回值是否为空,null等,或者一些常见格式处理,利用客户端适当分担服务器压力。

三、业务服务层

1、业务校验

例如传入订单号,经过数据库层查询,没有订单数据,这里称为业务性质的异常,代码本身没有问题,但是业务逻辑无法正常执行。

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 ;
}

2、组装业务逻辑

通常情况下服务层作为逻辑做复杂的一块,用来拼接业务核心步骤,可以通过业务逻辑判定,一步一步执行程序,避免在程序入口做大量可能用到的对象创建和需求数据查询。

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、数据模型构建

通常情况业务层是偏复杂的,如果想关快速理解业务层,可以对复杂的业务方法,在提供一个返参构建的方法,用来处理服务层要向控制层回传的参数,这样可以让重度的服务层方法变的清晰。

private InfoModel buildModel (BaseInfo baseInfo,DetailInfoEntity detailInfo){InfoModel infoModel = new InfoModel() ;infoModel.setBaseInfo(baseInfo);infoModel.setDetailInfoEntity(detailInfo);return infoModel ;
}

四、数据交互层

1、逆向工程

这里以使用mybatis框架或者mybatis-plus框架作为参考。如果是mybatis框架,建议逆向工程的模板代码不做自定义的修改,如果需要自定义方法,在mapper和xml层面再自定义一个扩展文件,用来存放自定义的方法和SQL逻辑,这样避免表结构变动大引发的强烈不适。

当然现在大部分都会mybatis-plus作为持久层组件,可以避免上述问题。

2、数据交互

针对业务层的需要,提供相应的数据查询方法,只处理与数据库交互的逻辑,避免出现业务逻辑,尤其在分布式架构下,不同服务的数据查询和组装,不应该出现在该层。

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·点这里 ☆☆☆☆☆

编码风格:Mvc模式下SSM环境,代码分层管理相关推荐

  1. php下的ssm模式,编码风格:Mvc模式下SSM环境,代码分层管理

    一.分层策略 MVC模式与代码分层策略,MVC全名是ModelViewController即模型-视图-控制器,作为一种软件设计典范,用一种业务逻辑.数据.界面显示分离的方法组织代码,将业务逻辑聚集到 ...

  2. 【案例分享】使用ActiveReports报表工具,在.NET MVC模式下动态创建报表

    提起报表,大家会觉得即熟悉又陌生,好像常常在工作中使用,又似乎无法准确描述报表.今天我们来一起了解一下什么是报表,报表的结构.构成元素,以及为什么需要报表. 什么是报表 简单的说:报表就是通过表格.图 ...

  3. 基于MVC模式下的二手车拍卖平台设计

    课程名称:<软件体系结构与设计模式> 实验项目名称:基于MVC模式下的二手车拍卖平台设计 实验内容 按下列要求编写程序并上机调试运行: 拍卖系统要又三个显示界面,分别是车体图片,文字描述和 ...

  4. MVC模式下My97DatePicker日期控件引用注意事项

    My97DatePicker日期控件之前在用webform模式开发的时候,只要 <script language="javascript" type="text/j ...

  5. VC++设置Release模式下允许调试代码

    2019独角兽企业重金招聘Python工程师标准>>> 在Release中允许代码调试,只需要关闭代码优化,设置调试信息输出就可以了.以VS2015为例,说明如何设置相关项目属性,其 ...

  6. Android:MVC模式(下)

    在上一篇文章中,我们将 View 类单独出来并完成了设计和编写.这次我们将完成 Model 类,并通过 Controller 将两者连接起来,完成这个计算器程序. 模型(Model)就是程序中封装了数 ...

  7. 【大数据Hadoop】HDFS-HA模式下Checkpointer机制代码分析

    Checkpointer机制 概览 源码解读 相关配置项 源码解析 创建StandbyCheckpointer StandbyCheckpointer分析 CheckpointerThread 干了些 ...

  8. mvc三层架构_Java架构-代码分层的设计之道

    分层思想,是应用系统最常见的一种架构模式,我们会将系统横向切割,根据业务职责划分.MVC 三层架构就是非常典型架构模式,划分的目的是规划软件系统的逻辑结构便于开发维护.MVC:英文即 Model-Vi ...

  9. 远程办公模式下,如何做好团队管理?

    在现代社会发展下,人们的生产和工作方式将趋向集团化,不再是分散的方式,组建团队也就成为常见且必要的工作方式,团队管理也成为企业管理的重要一环.做好团队管理,让团队成员充分发挥自己的价值,可以提高员工的 ...

最新文章

  1. Python-图像的手绘效果
  2. 动画性能优化-requestAnimationFrame、GPU等
  3. 为什么我们需要给 Angular library 创建多重入口 multiple entry point
  4. Linux:分享50个实用的基础命令,欢迎收藏!
  5. 【转】医学影像调窗技术!!!!
  6. 信息学奥赛C++语言:斗转星移
  7. 7-2 输出约数 (9 分)
  8. 诗与远方:无题(七十六)
  9. Python 工匠: 异常处理的三个好习惯
  10. 【2(2N+1)魔方阵 】
  11. Python 中的 __str__ 与 __repr__ 到底有什么差别
  12. xticks函数--Matplotlib
  13. PPT实现单页点名的方式
  14. 南阳计算机职称考试报名时间2015,2015河南公务员考试14日起开始报名 南阳市计划招录590人...
  15. C语言-99乘法表-正倒三角
  16. 信创办公--基于WPS的Word最佳实践系列(图片背景的删除)
  17. Python字典知识总结
  18. AD18设计PCB时常见问题及操作
  19. 网站链接被微信屏蔽禁止访问的解决办法
  20. 啦啦啦!令人激动的国庆小长假快要到来啦!大家是否都有出游的打算呢?

热门文章

  1. 计组之数据运算:3、定点数、浮点数
  2. (软件工程复习核心重点)第五章详细设计-第五节:程序复杂度的定量度量
  3. 二叉树经典题之从前序和中序遍历构建二叉树
  4. const、volatile、mutable关键字
  5. 33. 脱壳篇-重建输入表
  6. UIBackgroundTaskIdentifier 进入后台后结束任务再挂起APP
  7. 文件、文件夹操作(I)
  8. 快捷配置Hibernate实现对数据库的配置(构建通道)
  9. Xcode7 添加PCH文件
  10. 图书管理模块功能设计