在mybatis中进行对象关系映射时,肯定会用到的一个功能就是,对属性赋值,且还要满足下划线命名与驼峰命名的规范. 在这里记录一下是如何实现的
/**
* 下划线转驼峰
* @param name 属性名
* @return name 驼峰命名
*/
public String toHump(String name){
if (name.contains("_")){
Pattern pattern = Pattern.compile("_(\\w)");
name = name.toLowerCase();
Matcher matcher = pattern.matcher(name);
StringBuffer sb = new StringBuffer();
while (matcher.find()){
matcher.appendReplacement(sb,matcher.group(1).toUpperCase());
}
matcher.appendTail(sb);
return sb.toString();
}
return name;
}
/**
* 根据字段名称设置,对象属性
* @param o 要设置值的对象
* @param columnName 字段名
* @param columnValue 字段值
*/
public void setFieldValueForColumn(Object o,String columnName,Object columnValue){
Class<?> clazz = o.getClass();
try {
// 根据字段获取属性
Field field = clazz.getDeclaredField(columnName);
// 私有属性开放权限
field.setAccessible(true);
field.set(o,columnValue);
field.setAccessible(false);
} catch (NoSuchFieldException | IllegalAccessException e) {
// 没有找到对应的属性名,可能是下划线命名,在异常处理中装换
if (columnName.contains("_")){
// 重新调用方法设置属性
setFieldValueForColumn(o,this.toHump(columnName),columnValue);
}
}
}
@Test
public void test1(){
String name = "USER_NAME";
String s = toHump(name);
System.out.println(s); // userName
}
@Test
public void test2(){
User user= new User();
this.setFieldValueForColumn(vo,"user_name","用户名");
System.out.println(user);
}