用工具逆向数据库,映射出来的bean一般是不修改的。
但是有时候就是需要添加一些字段,添加的字段需要特殊处理。
(我这个方法被大佬重构了,等有空再整理重构后的把)
原来的思路
- 写一个新对象,复制映射的对象,改xml查询的返回结果
新思路
- 新建个model继承bean,
遇到的问题:
结构一样了,但是每次都要自己手动再复制数据,一通getset要命了
思路
通过反射把bean的字段,赋值到model
public static <T> void copySameField(T source, T target) {
if (source == null) {
return;
}
if (target == null) {
return;
}
Map<String, Field> targetFields = getFieldMap(target.getClass());
if (targetFields == null || targetFields.size() == 0) {
return;
}
Map<String, Field> sourceFields = getFieldMap(source.getClass());
if (sourceFields == null || sourceFields.size() == 0) {
return;
}
for (String fieldName : targetFields.keySet()) {
if (!targetFields.containsKey(fieldName)) {
continue;
}
Field targetField = targetFields.get(fieldName);
Field sourceField = sourceFields.get(fieldName);
Object sourceVal = getVal(source, sourceField);
setVal(target, targetField, sourceVal);
}
return;
}
public static Map<String, Field> getFieldMap(Class clazz) {
List<Field> fields = getFields(clazz);
if (fields == null || fields.size() == 0) {
return null;
}
Map<String, Field> map = new HashMap<String, Field>();
for (Field field : fields) {
map.put(field.getName(), field);
}
return map;
}
public static <T> Object getVal(T obj, Field field) {
if (obj == null) {
return null;
}
if (field == null) {
return null;
}
try {
field.setAccessible(true);
Object resObject = field.get(obj);
return resObject;
} catch (Exception e) {
logger.warn(obj.getClass().getName() + ":" + field.getName() + ":" + ExceptionUtils.getFullStackTrace(e));
}
return null;
}
public static <T> void setVal(T obj, Field field, Object val) {
if (obj == null) {
return;
}
try {
if (field == null) {
return;
}
field.setAccessible(true);
field.set(obj, val);
} catch (Exception e) {
logger.warn(obj.getClass().getName() + ":" + field.getName() + ":" + ExceptionUtils.getFullStackTrace(e));
}
}