随手记
主表A:tiger,panda,lion...等等字段(示例)
@Data
class A{
String tiger;
String panda;
String lion;
}
现新增需求,每个动物,都要有对应解释。
在实际开发中,实际上表A字段很多,并且很多地方有引用该表,贸然新增字段,改动很大。
则新增扩展表,仅三个字段(其他固定字段不写了)
扩展表B: msg、msgType、main_id
@Data
class B{
/**
* 动物解释
**/
String msg;
/**
* 动物的类型
* 1:tiger
* 2:panda
* 3:lion
*/
Integer msgType;
/**
* 主表id
*/
String mainId;
}
前端请求数据时,返回实体,要将所有数据组合起来。
返回实体如下:
@Data
class resultVo{
String tiger;
String tigerMsg;
String panda;
String pandaMsg;
String lion;
String lionMsg;
}
写个枚举:
@Getter
public enum AnimalMsgTypeEnum {
TIGER("老虎",1,"tigerMsg"),
PANDA("熊猫",2,"pandaMsg"),
LION("狮子",3,"lionMsg");
String msg;
Integer value;
String fieldName;
AnimalMsgTypeEnum(String msg , Integer value,String fieldName){
this.msg = msg;
this.value = value;
this.fieldName = fieldName;
}
/**
* 通过value获取fieldName
*/
public static String getFieldNameByValue(Integer value){
for(AnimalMsgTypeEnummsgTypeEnum: values()){
if(msgTypeEnum.getValue().equals(value)){
return msgTypeEnum.getFieldName();
}
}
return null;
}
}
返回实体组合 利用反射为返回实体的字段赋值
private resultVo setMsg( resultVo vo, List<B> messages) throws NoSuchFieldException, IllegalAccessException {
if(messages != null && messages.size() > 0){
//遍历 扩展表数据
for (B message : messages) {
//获取字段名
String filedName = AnimalMsgTypeEnum.getFieldNameByValue(message.getMsgType());
if(filedName != null){
try {
//利用反射为vo的字段赋值
Class<?> exportClass = vo.getClass();
Field field = exportClass.getDeclaredField(filedName);
field.setAccessible(true);
//为实体放入扩展表的值
field.set(vo, message.getMsg());
}catch (Exception e){
log.info("setMsg reflect error",e);
e.printStackTrace();
}
}
}
}
return vo;
}