【泛型】一个简易的对象间转换的工具类(DO转VO)

最近项目中经常要将数据库中查出来的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版权协议,转载请附上原文出处链接和本声明。