0、背景
从第三方网站获取到每日的交易数据,然后将这批数据保存到当前系统数据库内。字段数量不固定(有的日数据可能返回80多个字段,有的可能是100多个字段),同时字段数量较多(最大范围在120个字段)。
1、处理思路
将实体字段设置注解,然后同步过来的数据,根据字段的值与注解内容进行匹配,如果匹配一致保存到实体内。
2、代码
2.1、实体以及注解设计
@Data
@TableName("core_data")
public class CoreDataEntity implements Serializable {
private static final long serialVersionUID = 1L;
...
/**
* 数据入库时间
*/
@CoreDateField(name = "create_time",value = "createTime",ch = "入库时间")
private Date createTime;
/**
* 日期
*/
@CoreDateField(name = "date",value = "date",ch = "日期")
private String date;
/**
* 时间
*/
@CoreDateField(name = "time",value = "time",ch = "时间")
private String time;
/**
* 计划名称
*/
@CoreDateField(name = "campaign_name",value = "campaignName",ch = "计划名称")
private String campaignName;
...
其中CoreDateField为主要注释的注解
name:内容对应数据库表字段
value:内容对应实体字段(涉及到其他业务场景而创建的)
ch:内容对应中文含义(涉及到其他业务场景而创建的)
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface CoreDateField {
String name() default "";
String value() default "";
String ch() default "";
}
2.2、同步后获取数据的代码
jsonArray为从上游系统同步过来的数据内容
private static List<CoreDataEntity> buildCoreDataList(JSONArray jsonArray){
List<CoreDataEntity> coreDataList = new ArrayList<>();
for (int i = 0; i < jsonArray.size(); i++) {
try {
Class<?> cls = CoreDataEntity.class;
Object instance = cls.newInstance();
JSONObject jsonObject = jsonArray.getJSONObject(i);
Set<String> strings = jsonObject.keySet();
//获取全部字段
Field[] fields = cls.getDeclaredFields();
//根据字段上的注解找到对应的数据库保存字段,然后去匹配是否存在这个字段,如果存在那么就调用set方法
for (Field field : fields) {
if (field.isAnnotationPresent(CoreDateField.class)) {
CoreDateField annotation = field.getAnnotation(CoreDateField.class);
String fieldName = annotation.name();
String fieldValue = annotation.value();
if (strings.contains(fieldName)) {
//如果字段存在于本次查询到的数据内的话,获取其值,并调用set方法保存
Object str = jsonObject.get(fieldName);
String methodName = "set" + Character.toUpperCase(fieldValue.charAt(0)) + fieldValue.substring(1);
Method method = cls.getMethod(methodName, String.class);
method.invoke(instance,String.valueOf(str));
}
}
}
coreDataList.add((CoreDataEntity) instance);
} catch (Exception e) {
e.getStackTrace();
}
}
return coreDataList;
}
3、最后
此方案可以避免手写多个get、set方案,同时若后期上游系统新增字段,可以直接修改代码内实体内容,并新增注解对应内容即可。处理方案为个人浅见,希望各位大佬有更好的方案可以不吝赐教。