最近项目中经常要将数据库中查出来的DO类转换为VO类,之前的做法是每个都对应一个XXConverter,重复代码把人写的精疲力竭,于是开发了如下工具类。
首先,直接看工具类代码:
public class BaseConverter<DO, VO> {
private static final Logger logger = LoggerFactory.getLogger(BaseConverter.class);
/**
* 单个对象转换
*/
public VO convert(DO from, Class<VO> clazz) {
if (from == null) {
return null;
}
VO to = null;
try {
to = clazz.newInstance();
} catch (Exception e) {
logger.error("初始化{}对象失败。", clazz, e);
}
convert(from, to);
return to;
}
/**
* 批量对象转换
*/
public List<VO> convert(List<DO> fromList, Class<VO> clazz) {
if (CollectionUtils.isEmpty(fromList)) {
return null;
}
List<VO> toList = new ArrayList<VO>();
for (DO from : fromList) {
toList.add(convert(from, clazz));
}
return toList;
}
/**
* 属性拷贝方法,有特殊需求时子类覆写此方法
*/
protected void convert(DO from, VO to) {
BeanUtils.copyProperties(from, to);
}
}
工具类利用泛型来实现单个和批量对象的属性拷贝,留下一个用于重载的方法void convert(DO from, VO to)来在属性名或属性类型不一致时覆写做特殊处理。
下面来新建一个DO和一个VO,省略getter和setter方法如下:
public class PersonDO {
/** 姓名 */
private String name;
/** 生日 */
private Date birthDate;
public PersonDO() {
}
public PersonDO(String name, Date birthDate) {
this.name = name;
this.birthDate = birthDate;
}
}
public class PersonVO {
/** 姓名 */
private String name;
/** 生日 */
private String birthDate;
@Override
public String toString() {
return "PersonVO{" + "name='" + name + '\'' + ", birthDate='" + birthDate + '\'' + '}';
}
}
下面看转换器PersonConverter写法:
public class PersonConverter extends BaseConverter<PersonDO, PersonVO> {
@Override
protected void convert(PersonDO from, PersonVO to) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
to.setBirthDate(simpleDateFormat.format(from.getBirthDate()));
super.convert(from, to);
}
}
可见转换器代码相当简洁,只是重写了convert格式化了以下出生日期,下面写个main方法测试一下:
public static void main(String[] args) {
PersonConverter converter = new PersonConverter();
List<PersonDO> fromList = new ArrayList<PersonDO>();
fromList.add(new PersonDO("test1", new Date()));
fromList.add(new PersonDO("test2", new Date()));
List<PersonVO> toList = converter.convert(fromList, PersonVO.class);
for (PersonVO personVO : toList) {
System.out.println(personVO);
}
}
运行结果:
PersonVO{name='test1', birthDate='2017-02-09'}
PersonVO{name='test2', birthDate='2017-02-09'}
可见对象成功转换了,通过继承BaseConverter可以省去很多代码,避免写重复代码的恶心感。
我的博客:blog.scarlettbai.com
版权声明:本文为silk_bar原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。