提高效率一直是个永恒的话题,编程中有一项也是可以提到效率的,那就是专注做一件事情,让其它没有强紧密联系的与之分开。这里分享下我们做CRUD时遇到的常见数据处理场景:
优点:
缺点:
上面关于默认值与null语义问题不需要解决,因为我们认为具有默认值带来的优点远大于可空字段带来的烦恼,我们来看默认值与系统字段一般情况下如何处理:
public static <T> void emptyNullValue(final T model) { Class<?> tClass = model.getClass(); List<Field> fields = Arrays.asList(tClass.getDeclaredFields()); for (Field field : fields) { Type t = field.getType(); field.setAccessible(true); try { if (t == String.class && field.get(model) == null) { field.set(model, ""); } else if (t == BigDecimal.class && field.get(model) == null) { field.set(model, new BigDecimal(0)); } else if (t == Long.class && field.get(model) == null) { field.set(model, new Long(0)); } else if (t == Integer.class && field.get(model) == null) { field.set(model, new Integer(0)); } else if (t == Date.class && field.get(model) == null) { field.set(model, TimeHelper.LocalDateTimeToDate(java.time.LocalDateTime.of(1990, 1, 1, 0, 0, 0, 0))); } } catch (IllegalAccessException e) { e.printStackTrace(); } } }
然后在代码调用insert前调用函数来解决:
ModelHelper.emptyNullValue(request);
如何处理系统字段呢,在创建编辑数据时,需要获取当前用户,然后根据逻辑分别更新创建人信息以及编辑人信息,我们专门编写一个反射机制的函数来处理系统字段:
注:下面的系统字段的识别,是靠系统约定实现的,比如creator约定为创建人等,可根据不同的情况做数据兼容,如果系统设计的好,一般在一个系统下所有表的风格应该是相同的。
public static <T> void buildCreateAndModify(T model,ModifyModel modifyModel,boolean isCreate){ Class<?> tClass = model.getClass(); List<Field> fields = Arrays.asList(tClass.getDeclaredFields()); for (Field field : fields) { Type t = field.getType(); field.setAccessible(true); try { if(isCreate){ if (field.getName().equals(modifyModel.getcId())) { field.set(model, modifyModel.getUserId()); } if (field.getName().equals(modifyModel.getcName())) { field.set(model, modifyModel.getUserName()); } if (field.getName().equals(modifyModel.getcTime())) { field.set(model, new Date()); } } if (field.getName().equals(modifyModel.getmId())) { field.set(model, modifyModel.getUserId()); } if (field.getName().equals(modifyModel.getmName())) { field.set(model, modifyModel.getUserName()); } if (field.getName().equals(modifyModel.getmTime())) { field.set(model, new Date()); } } catch (IllegalAccessException e) { e.printStackTrace(); } } }
最后在数据处理前,根据创建或者编辑去调用函数来给系统字段赋值,这类代码都混杂在业务代码中。