博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【泛型】一个简易的对象间转换的工具类(DO转VO)
阅读量:4077 次
发布时间:2019-05-25

本文共 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();    List
fromList = 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/

你可能感兴趣的文章
我觉得在室内弄无人机开发装个防撞机架还是很有必要的,TBUS就做得很好。
查看>>
serial也是见到很多次了,似乎它就是一种串行通信协议
查看>>
TBUS的一些信息
查看>>
PX4+激光雷达在gazebo中仿真实现(古月居)
查看>>
我感觉你要弄无人机+激光雷达,可以先在车子上实现,再放到无人机上应该很快。
查看>>
专业和业余的区别就在于你在基础在基本功打磨练习花的时间
查看>>
通过mavlink实现自主航线的过程笔记
查看>>
Ardupilot飞控Mavlink代码学习
查看>>
我发现我看到的无人驾驶车上的激光雷达外观差不多
查看>>
这些网站有一些嵌入式面试题合集
查看>>
我觉得刷题是有必要的,不然小心实际被问的时候懵逼,我觉得你需要刷个50份面试题。跟考研数学疯狂刷卷子一样!
查看>>
我觉得嵌入式面试三要素:基础吃透+项目+大量刷题,缺一不可。不刷题是不行的。而且得是大量刷,刷出感觉套路,别人做题都做得是固定题型套路条件反射了,你还在那慢慢理解慢慢推是不行的,也是考研的教训。
查看>>
理解一下ROS里面包和节点的概念
查看>>
看mavros有没有连上飞控用rostopic echo /mavros/state
查看>>
CSDN 博客添加无水印图片的方法
查看>>
我感觉现代交流传动技术及其控制系统,似乎就是讲的电机控制,PWM控制,似乎还讲到了串级控制调速。
查看>>
智能无人机课程第二期十八章目标检测与追踪
查看>>
写程序关键是真正自己开始动手写,不要总是想着等全部弄懂了再写
查看>>
VScode下载安装
查看>>
vscode安装常用插件
查看>>