提高效率一直是个永恒的话题,编程中有一项也是可以提到效率的,那就是专注做一件事情,让其它没有强紧密联系的与之分开。这里分享下我们做CRUD时遇到的常见数据处理场景:数据库表字段全部设计为非空,即使这个字段在业务上是可以为空的,之所以将数据库表字段全部设计为非空,这里有优点也有缺点 ...
提高效率一直是个永恒的话题,编程中有一项也是可以提到效率的,那就是专注做一件事情,让其它没有强紧密联系的与之分开。这里分享下我们做CRUD时遇到的常见数据处理场景:
- 数据库表字段全部设计为非空,即使这个字段在业务上是可以为空的,之所以将数据库表字段全部设计为非空,这里有优点也有缺点,我们认为优点大于缺点,所以选择了它
优点:
- 获取值时,不用判断这个字段是否为null,直接可用于逻辑运算。
- mysql DBA推荐此方案,可能是有利于性能,这里我并非求证过。
缺点:
- 业务含义没有null清楚,比如int字段默认值设置成0,0就没有null语义清晰。
- 在使用ORM插入数据时,需要处理非空字段值为null的问题。
- 系统字段的赋值,比如创建人,创建人id,创建时间,编辑人,编辑人id,编辑时间等,这些都需要在实际插入数据库前赋值给Model。这些系统字段与具体的业务一般没有太大的关联关系,只是起到标注数据被什么人在什么时间处理的,当这些非业务相关的代码充斥在代码中时,就显得有些多余,而且这类代码多了也会显示冗余,最后带来的结果就是非关键代码比例大。
再看action中的调用:只需要在参数前面增加注解@ManageModelConfig,如果需要处理默认值,则将启用默认值的选项设置成true即可,下面的实现部分完全看不到任何与业务无关的代码。
@RequestMapping(value = "/addOrUpdateUser") @ResponseBody public Map<String, Object> addOrUpdateUser(@ManageModelConfig(isSetDefaultFieldsValue=true) EmployeeDto request) { Map<String, Object> ret = new HashMap<>(); ValidateUtil.ValidateResult result= new ValidateUtil().ValidateModel(request); boolean isCreate=request.getId() == 0; try { if (isCreate) { employeeService.insert(request); } else { employeeService.updateByPrimaryKey(request); } ret.put("data", "ok"); }catch (Exception e){ ret.put("err", e.getMessage()); } return ret; }
原标题:如何解决CRUD操作中与业务无关的字段赋值
关键词:
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:
admin#shaoqun.com
(#换成@)。