本文共 2651 字,大约阅读时间需要 8 分钟。
最近项目中经常要将数据库中查出来的DO类转换为VO类,之前的做法是每个都对应一个XXConverter,重复代码把人写的精疲力竭,于是开发了如下工具类。
首先,直接看工具类代码:
public class BaseConverter{ private static final Logger logger = LoggerFactory.getLogger(BaseConverter.class); /** * 单个对象转换 */ public VO convert(DO from, Class 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 convert(List fromList, Class clazz) { if (CollectionUtils.isEmpty(fromList)) { return null; } List toList = new ArrayList (); 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{ @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(); ListfromList = new ArrayList (); fromList.add(new PersonDO("test1", new Date())); fromList.add(new PersonDO("test2", new Date())); List 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
转载地址:http://oesni.baihongyu.com/