碰到业务需要存历史记录表,所有表都要存历史,所以需要一个公共方法随时调用,就写了一个根据java bean 直接获取属性并将驼峰命名方式转换为数据库字段名下划线命名方式,有子父类关系,所以记录一下做的过程
/**
* @Description: 保存历史表数据记录的工具类
*/
@Slf4j
public class HisTableUtil {
static String[] types = {"java.lang.Integer",
"java.lang.Double",
"java.lang.Float",
"java.lang.Long",
"java.lang.Short",
"java.lang.Byte",
"java.lang.Boolean",
"java.lang.Character",
"java.lang.String",
"int","double","long","short","byte","boolean","char","float"};
/**
*
* @Title: classToProperty
* @Description: TODO(将class对象取出属性名并且按照数据库命名方式返回)
* @param cls
* @param listFiled 封装属性后的list
* @param listValue 封装属性后值的list
* @param @return 参数说明
* @return List<String> 返回类型
* @throws
*/
public static Map<String,Object> classToProperty(Object obj){
Map<String,Object> resultMap = new HashMap<>();
List<Object> filedList = new ArrayList<>();
List<Object> valueList = new ArrayList<>();
try {
List<Field> fieldList = new ArrayList<>() ;
Class<?> cls = obj.getClass();
while (cls != null) { //当父类为null的时候说明到达了最上层的父类(Object类).
fieldList.addAll(Arrays.asList(cls .getDeclaredFields()));
cls = cls.getSuperclass(); //得到父类,然后赋给自己
}
Field[] fields = new Field[fieldList.size()];
fieldList.toArray(fields);
for (int i = 0; i < fields.length; i++) {
Field field = fields[i];
field.setAccessible(true);
String name = field.getName();
if(name.equals("serialVersionUID")) {
continue;
}
if(name.equals("log")) {
continue;
}
if(Arrays.asList(types).contains(field.getType().getName())) {
filedList.add(changeFieldToColumnName(name));
Object value = field.get(obj) ;
valueList.add(value);
}
}
} catch (Exception e) {
log.error("-->> classToProperty(cls, filedList, valueList) - error:异常", e);
}
resultMap.put("filedList", filedList);
resultMap.put("valueList", valueList);
return resultMap;
}
/**
* @Title: changeFieldToColumnName
* @Description: TODO(将驼峰风格的字符串转换为以下划线分隔的数据库字段)
* @param fieldName 转换的字符串
* @return String 返回类型
* @throws
*/
public static String changeFieldToColumnName(String fieldName) {
if (fieldName == null) {
return null;
}
StringBuffer columnName = new StringBuffer();
int length = fieldName.length();
for (int i = 0; i < length; i++) {
char c = fieldName.charAt(i);
if ('A' <= c && 'Z' >= c) {
columnName.append("_").append((char) (c + 32));
} else {
columnName.append(fieldName.charAt(i));
}
}
return columnName.toString();
}
/**
* 将以下划线分隔的数据库字段转换为驼峰风格的字符串
* @param fieldName
* @return
*/
public static String changeColumnToFieldName(String columnName) {
String[] array = columnName.split("_");
StringBuffer sb = null;
for (String cn : array) {
cn = cn.toLowerCase();
if (sb == null) {
sb = new StringBuffer(cn);
continue;
}
sb.append(cn.substring(0, 1).toUpperCase()).append(cn.substring(1));
}
return sb.toString();
}
}