CRUD即CREATE,READ,UPDATE,DELETE的首字母的合写,意思是增读改删。前人为了便于发音和理解,改为增删改查。

CRUD基本上是软件开发中中相当部分功能的最小功能模块构成,虽然软件的功能并不总是CRUD,但对于信息的操作就只有这四个了。

我们现在还是这么称呼,一个方面是因为大部分的功能要求和此类似,其次是因为这个名称还不错。

原则上来说CRUD功能很简单,简单到一个得到训练的初中生都能够做得很好,如果不是考虑到英文,可以把这个学历下降到小学,更具体是5年级以上。

我总是喜欢那样的人:有自知之明,热爱学习,努力学习,不耻相师。

一、crud总体是简单的

通常来说业务虽然简单,但又不是那么简单。

软件设计中,表、对象设计本质上就是对客观世界的模仿/映射。我们的很多灵感完全来源于客观世界,少数来自于数学。

现实的世界并不简单,事物之间通常是有勾连的。既然事物有勾连,那么软件设计中的对象和表也理应体现这种关联。

所以,一个crud,虽然很简单,也不是那么简单,但终归是简单的。

在软件工程师工作中,比CRUD简单的活并不容易找到。

如果一个工程师觉得这个也困难,那么毫无疑问是极其不合格。他要么反省并努力,要么换一行,避免徒增笑话。

反省和努力应该是我们大部分人的自觉和选择。

二、基本的例子

现在我们写代码已经变得很轻松,至少对于一些简单的功能是可以那么说的。为了便于理解,这里举例下。

有个需求如下:

有个积分规则,规则有点小复杂,和时间、客户等级、消费金额、商品分类等都有关系,简而言之,就是让客户弄不清楚,但好像又有很多优惠一样。

所以,设计师设计了至少5张表,用来存储积分设置,涵盖规则基本信息,各种计算规则,这五张表依次是:

1.ruleBase --规则基本信息,id为自增主键

2.rule_time_setting-规则时间设置,外键rule_id指向ruleBase

3.rule_customer_setting-客户设置,外键rule_id指向ruleBase

4.rule_goods_setting-商品设置,外键rule_id指向ruleBase

5.rule_amount_setting-金额设置,外键rule_id指向ruleBase

此外还有两张表:

6.customer-客户表,外键rule_id只想ruleBase

7.customer_reward_point_dtl-客户积分获取明细,外键customer_id,rule_id分别指向customer,ruleBase。

rule_*表依赖于ruleBase存在。当规则删除的时候,有关的数据应该删除掉。

编码工程师在理解需求和设计之后,就可以编码了。

如果写得正确,大概是这样的(ruleBase,基于ssm编写):

@Service
public class RuleBaseServiceImpl implements IRuleBaseService
{
@Autowired
private RuleBaseMapper ruleBaseMapper; /**
* 查询积分规则基本信息
*
* @param id 积分规则基本信息主键
* @return 积分规则基本信息
*/
@Override
public RuleBase selectRuleBaseById(Long id)
{
return ruleBaseMapper.selectRuleBaseById(id);
} /**
* 查询积分规则基本信息列表
*
* @param RuleBase 积分规则基本信息
* @return 积分规则基本信息
*/
@Override
public List<RuleBase> selectRuleBaseList(RuleBase RuleBase)
{
return ruleBaseMapper.selectRuleBaseList(RuleBase);
} /**
* 新增积分规则基本信息
*
* @param RuleBase 积分规则基本信息
* @return 结果
*/
@Transactional(propagation=Propagation.REQUIRED,isolation=Isolation.DEFAULT,rollbackFor=Exception.class)
@Override
public int insertRuleBase(RuleBase RuleBase)
{
//TODO::检测积分规则名称是否重复,如果重复则抛出异常
RuleBase.setCreateBy(SecurityUtils.getUsername());
RuleBase.setCreateTime(DateUtils.getNowDate());
return ruleBaseMapper.insertRuleBase(RuleBase);
} /**
* 批量新增积分规则基本信息
*
* @param RuleBaseList 积分规则基本信息
* @return 结果
*/
@Transactional(propagation=Propagation.REQUIRED,isolation=Isolation.DEFAULT,rollbackFor=Exception.class)
@Override
public int batchInsertRuleBase(List<RuleBase> RuleBaseList)
{
//TODO::检测积分规则名称是否重复,如果重复则抛出异常
for(RuleBase RuleBase : RuleBaseList){
RuleBase.setCreateBy(SecurityUtils.getUsername());
RuleBase.setCreateTime(DateUtils.getNowDate());
} return ruleBaseMapper.batchInsertRuleBase(RuleBaseList);
} /**
* 修改积分规则基本信息
*
* @param RuleBase 积分规则基本信息
* @return 结果
*/
@Transactional(propagation=Propagation.REQUIRED,isolation=Isolation.DEFAULT,rollbackFor=Exception.class)
@Override
public int updateRuleBase(RuleBase RuleBase)
{
//TODO::检测积分规则名称是否重复,如果重复则抛出异常
return ruleBaseMapper.updateRuleBase(RuleBase);
} /**
* 批量新增或更新 积分规则基本信息
*
* @param RuleBaseList 积分规则基本信息list
* @return 结果
*/
@Transactional(propagation=Propagation.REQUIRED,isolation=Isolation.DEFAULT,rollbackFor=Exception.class)
@Override
public int insertOrUpdateBatch(List<RuleBase> RuleBaseList) {
//TODO::检测积分规则名称是否重复,如果重复则抛出异常
return ruleBaseMapper.insertOrUpdateBatch(RuleBaseList);
} /**
* 批量删除积分规则基本信息
*
* @param ids 需要删除的积分规则基本信息主键
* @return 结果
*/
@Transactional(propagation=Propagation.REQUIRED,isolation=Isolation.DEFAULT,rollbackFor=Exception.class)
@Override
public int deleteRuleBaseByIds(Long[] ids)
{
//TODO::检测积分规则是否被客户引用,如果被应用抛出异常,提示“已经被引用,不能删除”
ruleBaseMapper.deleteRuleBaseByIds(ids);
} /**
* 删除积分规则基本信息信息
*
* @param id 积分规则基本信息主键
* @return 结果
*/
@Transactional(propagation=Propagation.REQUIRED,isolation=Isolation.DEFAULT,rollbackFor=Exception.class)
@Override
public int deleteRuleBaseById(Long id)
{
//TODO::检测积分规则是否被客户引用,如果被应用抛出异常,提示“已经被引用,不能删除”
return ruleBaseMapper.deleteRuleBaseById(id);
}
}

有的组织,或者某些业务可能不要求事务,或者添加实现事务的方式不一样,那么可以不需要如此写。不过这仅仅就是一个示例。

其余的几个略,不要浪费我们大家的时间。

三、经验

如果是有经验的负责编码的程序员(通常做过一两次就应该有),一看就知道应该如何写代码,大体过程值这样的:

1.使用工具快速生成各个表的crud代码(最基本的),这个过程可能就是1,2个小时左右

2.为各个crud添加判断是否被依赖,删除子表的有关代码,大概耗费2~3个小时

3.为各个具体的业务service添加上事务注解@Transactional(如果有别的偏好也可以,总之务必确保涉及到insert,delete,update的操作有事务).,大概几分钟。

有的时候,直接在代码生成模板中设置,甚至都不需要这一步。

4.处理控制器异常--主要是为异常给出合理和准确的异常描述

5.其它一些工作,例如数据初始化,给类和方法添加一些合适注释

6.协助前端工程师完成前端的编码

以上步骤1~5,理想情况下,可能就是一个上午的事情,多了就是一天的活,极少会需要2天甚至更多时间。

其中第1个步骤很关键:使用工具自动生成绝大部分代码。

注:上面步骤的时间估计,是基于前文例子的设计。

代码好像很多,其实工程师需要写的就没有几行代码(因为大部分代码是自动生成的)。

例子中,工作量一大部分在设计上,整个工作稍微有点技术含量的就是表设计和功能设计。

编码本上并没有什么技术含量(相对而言)

属于编码工程师要重点掌握一些技术:

  • 数据库基本知识和表设计
  • 软件设计基本理论
  • spring的基础知识
  • java基础知识
  • 熟练使用ide(eclipse、idea、netbean、vscode中的一种或者多种)

这种规则和要求对于其它语言是类似的。当我们追求效率和效果平衡的时候,一般只能这么做。

四、小节

是不是很简单?只要花费一些心思、时间,那么做一个会CRUD的工程师还是很简单的,难度比我们学会拼音还低得多。

对于受过正规软件工程训练的人而言,掌握这一套方法可能就是2~3天的时间。

企业应该加强工具的学习和使用,才能大大提升工作效率。

一个基于SSM的CRUD的标准写法的更多相关文章

  1. 【项目笔记】完成一个基于SSM框架的增删改查的模块后总结的问题

    最近为了准备新工作重新摸出了SSM框架,同时从0学习了JQuery,终于用一周做完了一个包括增删改查的模块(主要是属性太多了,其中一个类50+,复制粘贴耗时). 从中特意记下了几个遇到的问题,总结一下 ...

  2. 分享一个基于ssm框架下的webService接口开发

    首先肯定是导入相关jar包 cxf-core-3.1.9.jar cxf-rt-bindings-soap-3.1.9.jar cxf-rt-bindings-xml-3.1.9.jar cxf-rt ...

  3. 基于SSM的CRUD项目的详解

    创一个maven工程 创建web的目录和web.xml------------右击项目,build projet--->configure  project---->Project fac ...

  4. 基于SSM之Mybatis接口实现增删改查(CRUD)功能

    国庆已过,要安心的学习了. SSM框架以前做过基本的了解,相比于ssh它更为优秀. 现基于JAVA应用程序用Mybatis接口简单的实现CRUD功能: 基本结构: (PS:其实这个就是用的Mapper ...

  5. 基于SSM实现的简易员工管理系统

    之前自学完了JAVA基础,一直以来也没有做什么好玩的项目,最近暑假,时间上比较空闲,所以又学习了一下最近在企业实际应用中比较流行的SSM框架,以此为基础,通过网络课程,学习编写了一个基于SSM实现的M ...

  6. CXF 入门:创建一个基于WS-Security标准的安全验证(CXF回调函数使用,)

    http://jyao.iteye.com/blog/1346547 注意:以下客户端调用代码中获取服务端ws实例,都是通过CXF 入门: 远程接口调用方式实现 直入正题! 以下是服务端配置 ==== ...

  7. 基于SSM的Java Web应用开发原理初探

    SSM开发Web的框架已经很成熟了,成熟得以至于有点落后了.虽然如今是SOA架构大行其道,微服务铺天盖地的时代,不过因为仍有大量的企业开发依赖于SSM,本文简单对基于SSM的Java开发做一快速入门, ...

  8. 基于SSM的分页

    现在基本每一个项目都有用到分页,SSM也是当前企业用到的比较频繁的框架,这里我就总结一下基于SSM的分页: 一.首先我们要准备一个分页的工具类 /** * 分页 */ public class Pag ...

  9. html标记语言的标准写法-参考自http://www.zhihu.com/question/20797118/answer/16212312

    网页头部的声明应该是用 lang="zh" 还是 lang="zh-cn"?   添加评论   查看全部 12 个回答   skydiver ,程序员 5 人赞 ...

  10. PhantomJS是一个基于WebKit的服务器端JavaScript API

    PhantomJS是一个基于WebKit的服务器端JavaScript API,它基于 BSD开源协议发布.PhantomJS无需浏览器的支持即可实现对Web的支持,且原生支持各种Web标准,如DOM ...

随机推荐

  1. [ERROR] listen tcp :80: bind: permission denied

    出现这类提示的时候,表明当前用户没有权限进行 bind 操作. 在某些 Linux 云服务器提供商的运行环境中会出现. 解决方式:使用 sudo 切换为 root,然后在执行原操作. Refer:li ...

  2. WPF 修复引用库报错 所使用的 PresentationFramework 6

    本文记录一个 WPF 构建的坑,这是 WPF 仓库的运维管理大意挖的坑.将会在大家使用低版本的 dotnet 6 如 6.0.1 版本时,引用其他人使用高 dotnet 6 版本,如 dotnet 6 ...

  3. 2019-8-31-C#-自动翻页-PPT-测试脚本

    title author date CreateTime categories C# 自动翻页 PPT 测试脚本 lindexi 2019-08-31 16:55:58 +0800 2019-08-1 ...

  4. 2019-2-11-win10-uwp-安装文件-appinstaller-格式

    title author date CreateTime categories win10 uwp 安装文件 appinstaller 格式 lindexi 2019-02-11 08:55:31 + ...

  5. docker.from_env() 获取docker守护进程时出现 TypeError: load_config() got an unexpected keyword argument 'config_dict' 异常

    某天使用python重启docker容器时,出现了一个令人费解的BUG,我的代码为 1 def restart_docker(container_name): 2 # 连接到docker守护进程 3 ...

  6. 探索 DTD 在 XML 中的作用及解析:深入理解文档类型定义

    DTD 是文档类型定义(Document Type Definition)的缩写.DTD 定义了 XML 文档的结构以及合法的元素和属性. 为什么使用 DTD 通过使用 DTD,独立的团体可以就数据交 ...

  7. Kafka源码分析(四) - Server端-请求处理框架

    系列文章目录 https://zhuanlan.zhihu.com/p/367683572 一. 总体结构 先给一张概览图: 服务端请求处理过程涉及到两个模块:kafka.network和kafka. ...

  8. ubuntu系统下安装php7.4

    目录 一.下载/更新php源 二.安装php7.4 三.修改配置 3.1 修改www.conf 文件 四.配置域名 五.nginx的配置文件 5.1 sock方式和nginx配合工作 5.2监听900 ...

  9. Django性能之道:缓存应用与优化实战

    title: Django性能之道:缓存应用与优化实战 date: 2024/5/11 18:34:22 updated: 2024/5/11 18:34:22 categories: 后端开发 ta ...

  10. Linux环境下:程序的链接, 装载和库[动态链接]

    静态链接库在程序编译阶段就完成了链接工作,完成链接后,依赖的库就都打入了可执行文件中,所以文件大小一般会比较大. 而动态库链接库是在程序运行时才被链接的,所以磁盘上只要保留一份副本,因此节约了磁盘空间 ...