增删改事务 - 01 - 增删改流程
1. 流程概述
增删改作为事务相关的处理,需要格外注意入参的正确性,不正确的参数可能会导致异常
增删改操作时,用 DTO 来封装待修改数据,对DTO进行入参校验,校验完毕后,传入 service 层,将 DTO 转为 entity,存储到数据库
四个词就能概括下图:入参,校验,转换,入库
2. 流程细化
在这里举个简单的流程栗子:
2.1 入参 + 校验
2.1.1 构建DTO入参类,并做基础校验
/** DTO,非空校验添加的地方 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class WorkOperatorDTO {
/** 主键ID */
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/** 作业单位ID */
@NotNull(message = "作业单位ID不能为空")
private Long workCompId;
/** 电子工牌 - 非必填,可以设为 Null 或者 空字符串,修改 MP 的更新策略,使其不会跳过 NULL 的列 */
@TableField(updateStrategy = FieldStrategy.IGNORED)
private String eleWorkCard;
/** 身份证号 */
@NotBlank(message = "身份证号不能为空")
@Size(max = 18, message = "身份证号长度不能超过18位")
private String idCardNumber;
/** 关联的 ids */
@NotEmpty(message = "关联的 ids 不能为空")
List<Long> ids;
/** 入职日期 */
@NotBlank(message = "入职日期不能为空,格式yyyy-MM-dd")
@Pattern(regexp = "^\\d{4}-\\d{2}-\\d{2}$", message = "入职日期格式错误(yyyy-MM-dd)")
private String comeInDate;
}
2.1.2 在 controller 里面做复杂校验
注: ValidationUtils 是自己写的一个小工具类,主要判断字符串是否匹配正则表达式
/** Controller层 */
import javax.annotation.Resource;
@RestController
@RequestMapping("/work-operator")
public class WorkOperatorController {
@Resource
private IWorkOperatorService workOperatorService;
/**
* 入参校验,能够统一处理,则放到统一校验类里面,否则放到自己的类里处理
* @param dto 增改时的入参类
* @return
*/
private R checkDTO(WorkOperatorDTO dto) {
// 简单校验:身份证号、身份证号和性别匹配
if (dto.getIdCardNumber().length() != ValidationUtils.CHINA_ID_MAX_LENGTH) {
return R.fail(ConstantMessage.NOT_CHINA_ID_MAX_LENGTH);
}
if (!ValidationUtils.matchTargetRegex(dto.getIdCardNumber(), ValidationUtils.ID_CARD_REGEX)) {
return R.fail(ConstantMessage.NOT_CHINA_ID);
}
// 校验性别
int sexRes = Integer.parseInt(dto.getIdCardNumber().substring(16