背景
在前段时间的开发工作中,接手了一个很简单,很普通的开发任务。要求实现一个单表的基础数据的批量导入功能。评估下来,用户每次批量导入的数据量也就几千条,也不大。是不是很简单,没有骗你们吧。但是呢,我实际去看的时候发现,好家伙,表里竟然一百多个字段,全部是需要导入的(PS:表字段过多为什么没有分表的问题属于历史遗留问题,这里不做评判)。并且我遍寻整个项目,却没有找到处理批量导入的公共方法,相似功能全部都是if...else...
!!!???
当时我的心理活动是这样的:
:???
:我*,不是吧,这咋搞。
:我总不能去写一百多个判断吧?这样搞估计能被锤死,在我写那么多判断好累的呀!!!
于是我果断仿照。。。不行,不能果断!于是我就给项目简单写了批量导入的公共方法。
思路
对于导入数据的校验来说,核心其实只有几个方面:
- 必填校验
- 判空
- 格式,包含email,电话,身份证等特殊格式,长度等
- 与excel列的对应关系
- 字典:需要将导入数据中的内容转成字典值入库
- index:和cell对应关系
- 实体类数据组装
- 校验失败提示
其实,我们写的每一个if
判断,都是在做同一个事情。那吗,针对这个场景,我们就可以采用注解+反射的方式来解决。
开搞
自定义注解
首先,我们需要添加一个自定义注解。该注解主要标记相应字段与cell的对应关系以及需要进行的处理。(PS:上面提到的特殊格式的校验,这里没有做实现,需要的增加一个字段保存正则表达式即可)
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public @interface ImportValidation {
//下标,与excel中列对应,从0开始
int index();
//是否必填,默认是必填
boolean nullAble() default true;
// 字典的Code,用于字典转换
String domainCode() default "";
//字典的名称,用于错误提醒
String name() default "";
}