做一个数据同步的功能,定时从源库抽取部门表,同步到目标库的部门表中,因两个表的结构不同,做了一些映射处理,将源库字段映射到目标库字段中,获取到源数据后,创建一个新的目标对象,使用反射给对象赋值,然后添加到数据库中,这个是同步中的一个添加操作,碰上了类型不同,赋值出错的问题,经查得知,有个转换的方法可以使用:org.apache.commons.beanutils.ConvertUtils,代码如下:

private void addDept(Dept dept) {
SysDepart depart = new SysDepart();
for (TbField tbField : fieldList) {
try {
Field srcBmField = Dept.class.getDeclaredField(tbField.getTbBmField());
srcBmField.setAccessible(true);
Object value = srcBmField.get(dept);
Field dstBmField = SysDepart.class.getDeclaredField(tbField.getXgBmField());
dstBmField.setAccessible(true);
Object convert = ConvertUtils.convert(value, dstBmField.getType());
dstBmField.set(depart,convert);
} catch (NoSuchFieldException | IllegalAccessException e) {
e.printStackTrace();
}
}
log.info("{}",depart);
}

参数Dept是源数据,经过比对后这个记录在目标库中是没有的,因此需要添加。
fieldList是字段映射列表,只用已经映射的字段为目标对象赋值,未映射的就不管了。
Dept.class.getDeclaredField(tbField.getTbBmField());获取到源对象中映射字段,
srcBmField.setAccessible(true);设置字段操作权限,
Object value = srcBmField.get(dept);获取字段值
Field dstBmField = SysDepart.class.getDeclaredField(tbField.getXgBmField());获取目标对象中映射字段
dstBmField.setAccessible(true);设置字段操作权限
Object convert = ConvertUtils.convert(value, dstBmField.getType());将源字段值转换成目标字段类型
dstBmField.set(depart,convert);给目标对象赋值