一、简介
分析多层架构的JEE系统,经常存在JavaBean直接的拷贝,典型的解决方案就是手动拷贝,弊端很明显,代码中充斥大量Set Get方法,真正的业务没埋藏与值的拷贝之中.另一种方案就是使用BeanUtil,但BeanUtil不够很好的灵活性,又时候还不得不手动拷贝。
Dozer提供了一种非常好的解决方案。
Dozer 是一个对象转换工具。 Dozer可以在JavaBean到JavaBean之间进行递归数据复制,并且这些JavaBean可以是不同的复杂的类型。 所有的mapping,Dozer将会很直接的将名称相同的fields进行复制,如果field名不同,或者有特别的对应要求,则可以在xml中进行定义。 更多详细请参考dozer官网:http://dozer.sourceforge.net/documentation/about.html 。
二、下载
1、http://sourceforge.net/projects/dozer/files/
2、在maven中,pom文中加入:
<dependency> <groupId>net.sf.dozer</groupId> <artifactId>dozer</artifactId> <version>5.4.0</version> </dependency>
三、示例
po Book类
package dozer; import java.util.Date; /** * @author zhuc * @create 2013-3-28 下午1:57:50 */ public class Book { private Integer id; private String name; private String author; private String capacity; private Date birthday; private String bookTypeName; private Integer source; /** * @return the name */ public String getName() { return name; } /** * @return the author */ public String getAuthor() { return author; } /** * @param name the name to set */ public void setName(String name) { this.name = name; } /** * @param author the author to set */ public void setAuthor(String author) { this.author = author; } /** * @return the capacity */ public String getCapacity() { return capacity; } /** * @param capacity the capacity to set */ public void setCapacity(String capacity) { this.capacity = capacity; } /** * @return the id */ public Integer getId() { return id; } /** * @param id the id to set */ public void setId(Integer id) { this.id = id; } /** * @return the birthday */ public Date getBirthday() { return birthday; } /** * @param birthday the birthday to set */ public void setBirthday(Date birthday) { this.birthday = birthday; } /** * @return the bookTypeName */ public String getBookTypeName() { return bookTypeName; } /** * @param bookTypeName the bookTypeName to set */ public void setBookTypeName(String bookTypeName) { this.bookTypeName = bookTypeName; } /** * @return the source */ public Integer getSource() { return source; } /** * @param source the source to set */ public void setSource(Integer source) { this.source = source; } /* (non-Javadoc) * @see java.lang.Object#toString() */ @Override public String toString() { return "Book [id=" + id + ", name=" + name + ", author=" + author + ", capacity=" + capacity + ", birthday=" + birthday + ", bookTypeName=" + bookTypeName + ", source=" + source + "]"; } }
vo BookVo类
package dozer; /** * @author zhuc * @create 2013-3-28 下午1:58:34 */ public class BookVo { private Integer id; private String nameVo; private String authorVo; private Integer capacity; private String day; private BookType bookType; private String source; /** * @return the nameVo */ public String getNameVo() { return nameVo; } /** * @return the authorVo */ public String getAuthorVo() { return authorVo; } /** * @param nameVo the nameVo to set */ public void setNameVo(String nameVo) { this.nameVo = nameVo; } /** * @param authorVo the authorVo to set */ public void setAuthorVo(String authorVo) { this.authorVo = authorVo; } /** * @return the capacity */ public Integer getCapacity() { return capacity; } /** * @param capacity the capacity to set */ public void setCapacity(Integer capacity) { this.capacity = capacity; } /** * @return the id */ public Integer getId() { return id; } /** * @param id the id to set */ public void setId(Integer id) { this.id = id; } /** * @return the day */ public String getDay() { return day; } /** * @param day the day to set */ public void setDay(String day) { this.day = day; } /** * @return the bookType */ public BookType getBookType() { return bookType; } /** * @param bookType the bookType to set */ public void setBookType(BookType bookType) { this.bookType = bookType; } /** * @return the source */ public String getSource() { return source; } /** * @param source the source to set */ public void setSource(String source) { this.source = source; } /* (non-Javadoc) * @see java.lang.Object#toString() */ @Override public String toString() { return "BookVo [id=" + id + ", nameVo=" + nameVo + ", authorVo=" + authorVo + ", capacity=" + capacity + ", day=" + day + ", bookType=" + bookType + ", source=" + source + "]"; } }
其中vo中包含复杂对象BookType类
package dozer; /** * @author zhuc * @create 2013-3-28 下午2:43:16 */ public class BookType { private String name; private String desc; /** * @return the name */ public String getName() { return name; } /** * @return the desc */ public String getDesc() { return desc; } /** * @param name the name to set */ public void setName(String name) { this.name = name; } /** * @param desc the desc to set */ public void setDesc(String desc) { this.desc = desc; } /* (non-Javadoc) * @see java.lang.Object#toString() */ @Override public String toString() { return "BookType [name=" + name + ", desc=" + desc + "]"; } }
这里在复制对象,我们发现有类型不一致、名称不一样或者都不一样的需要自定义映射的字段等,我们需要自定义mapping.xml 映射文件。
<?xml version="1.0" encoding="UTF-8"?> <mappings xmlns="http://dozer.sourceforge.net" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://dozer.sourceforge.net http://dozer.sourceforge.net/schema/beanmapping.xsd"> <mapping date-format="yyyy-MM-dd HH:mm:ss"> <class-a>dozer.Book</class-a> <class-b>dozer.BookVo</class-b> <field> <a>name</a> <b>nameVo</b> </field> <field> <a>author</a> <b>authorVo</b> </field> <field> <a>birthday</a> <b>day</b> </field> <field> <a>bookTypeName</a> <b>bookType.name</b> </field> <field custom-converter="dozer.MyCustomConverter"> <a>source</a> <b>source</b> </field> </mapping> </mappings>
package dozer; import org.dozer.CustomConverter; /** * 自定义转换类 * @author zhuc * @create 2013-3-28 下午2:49:39 */ public class MyCustomConverter implements CustomConverter { @Override public Object convert(Object existingDestinationFieldValue, Object sourceFieldValue, Class<?> destinationClass, Class<?> sourceClass) { Object obj = null; if (null != sourceFieldValue) { if (sourceFieldValue instanceof Integer) { if (((Integer) sourceFieldValue).intValue() == 1900) { obj = "20世纪"; } else if (((Integer) sourceFieldValue).intValue() == 2000) { obj = "21世纪"; } } else if (sourceFieldValue instanceof String) { if ("20世纪".equals(sourceFieldValue)) { obj = 1900; } else if ("21世纪".equals(sourceFieldValue)) { obj = 2000; } } } return obj; } }
到这里,我们来看下真正的代码转换测试类:
package dozer; import java.util.ArrayList; import java.util.Date; import java.util.List; import org.dozer.DozerBeanMapper; /** * @author zhuc * @create 2013-3-28 下午3:15:49 */ public class Test { /** * @param args */ public static void main(String[] args) { List<String> mappers = new ArrayList<String>(); mappers.add("mapper.xml"); DozerBeanMapper dozer = new DozerBeanMapper(); dozer.setMappingFiles(mappers); Book book = new Book(); book.setId(100); // id 2个JavaBean一致 book.setName("明天"); // Book:name(String) <-> BookVo:nameVo(String) 类型一致,名称不一致 book.setAuthor("James"); // Book:author(String) <-> BookVo:authorVo(String) 类型一致,名称不一致 book.setCapacity("123"); // Book:capacity(String) <-> BookVo:capacity(Integer) 类型不一致,名称一致 book.setBirthday(new Date()); // Book:birthday(Date) <-> BookVo:day(String) 类型名称都不一致,且Date<->String互转 book.setBookTypeName("科教类"); // Book:bookTypeName(String) <-> BookVo:BookType:name(String) 源类的字段映射为目标类的复杂对象的字段。 book.setSource(1900); // Book:source(Integer) <-> BookVo:source(String) 自定义的转换,需要实现dozer的CustomConverter接口 BookVo vo = new BookVo(); dozer.map(book, vo); System.out.println(book); System.out.println(vo); } }
输出结果:
Book [id=100, name=明天, author=James, capacity=123, birthday=Thu Mar 28 16:00:20 CST 2013, bookTypeName=科教类, source=1900]
BookVo [id=100, nameVo=明天, authorVo=James, capacity=123, day=2013-03-28 16:00:20, bookType=BookType [name=科教类, desc=null], source=20世纪]
相关推荐
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
,,基于SMO的三相PMSM无速度传感器控制(基于反正切函数) ,核心关键词:SMO(滑模观测器); 三相PMSM(永磁同步电机); 无速度传感器控制; 反正切函数; 控制系统。,基于SMO算法的三相PMSM无速度传感器反正切函数控制
网络文化互动中的舆论引导与危机应对
人力资源+大数据+薪酬报告+涨薪调薪,在学习、工作生活中,越来越多的事务都会使用到报告,通常情况下,报告的内容含量大、篇幅较长。那么什么样的薪酬报告才是有效的呢?以下是小编精心整理的调薪申请报告,欢迎大家分享。相信老板看到这样的报告,一定会考虑涨薪的哦。
内容概要:本文全面探讨了大学生沉迷网络游戏的现状及成因,强调该问题已严重影响大学生的学业和个人发展。据统计显示,中国大学生网络游戏成瘾患病率超过15%,问题广泛且严重。分析指出沉迷原因涵盖个人因素(如自我管理能力缺失、逃避现实压力)、家庭因素(例如家庭教育缺失和家庭氛围不和谐)、学校因素(如大学管理松散和校园文化活动匮乏),以及社会因素(例如网游设计吸引人和监管部门不严)。基于以上成因,提出了多层次综合治理方案,包括但不限于强化家庭教育和沟通、改善大学管理模式、丰富校园文化、加强网络游戏审查力度和社会心理健康辅导等方面的对策。 适用人群:本研究适用于高校辅导员、心理学家、教育政策决策人员,以及关心青年成长的社会各界人士。 使用场景及目标:本文旨在引起社会对该问题的关注,并为教育界和其他相关群体提供了详细的参考资料用于制定相应的干预措施,以减少大学生游戏成瘾情况的发生。此外,也可供家长学习科学育子知识。 其他说明:除了直接提出具体治理办法外,还特别提到了营造健康的网络文化环境的重要性,提倡多方协作共促学生健康发展。同时呼吁进一步加强对网络游戏产业的研究与管理,确保产业的良性发展的同时也能
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
矢量边界,行政区域边界,精确到乡镇街道,可直接导入arcgis使用
TI维也纳整流器设计.rar
自驾游中的手机APP推荐
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
视讯镜头专利复现,基本复现
,,OMRON CP1H PLC脉冲控制三轴伺服, 码垛机,实际项目,程序结构清析,有完整的注释,重复功能做成FB功能块,在其它项目可以导出直接用,MCGS触摸屏程序,有电气CAD图纸。 ,关键词:OMRON CP1H PLC;脉冲控制;三轴伺服;码垛机;程序结构清晰;完整注释;FB功能块;MCGS触摸屏程序;电气CAD图纸。,OMRON PLC三轴伺服脉冲控制程序:结构清晰、注释完整,FB功能块可复用,配合MCGS触摸屏及CAD图纸的实际项目应用
是一款基于JAVA的串口调试工具,支持波特率9600-115200,仅供参考学习使用,
,,CO2激光切割机雕刻机打标机写字机喷涂机巡边机控制软件,包含上位机和控制板,也可源码 视频展示只体现工作流程和加工效果,如果激光功率足够大最快速度能跑到每秒两米 支持文件格式说明: 控制版和上位机通信接口为百兆以太网接口,数据载体为标准TCP协议 1.g代码 2.打印图片 3.plt格式文件 4.激光机在切割有效线条时匀速切割 5.有效线条切割速度和空程速度分别设置 6.空程运行具备加减速控制 7.图片打印时上位机界面实时显示打印进度 8.打开的图片和图形文件可鼠标缩放和拖动 9.图片格式转并保存转完成的指定格式图片 10.手动回原点控制 ,核心关键词: CO2激光切割机; 雕刻机; 打标机; 写字机; 喷涂机; 巡边机; 控制软件; 上位机; 控制板; 源码; 视频展示; 工作流程; 加工效果; 激光功率; 速度; 两秒; 文件格式; g代码; 打印图片; plt格式文件; 有效线条切割; 空程速度设置; 加减速控制; 上位机界面实时显示; 图片缩放和拖动; 图片格式转换; 手动回原点控制。 关键词用分号隔开: CO2激光切割机; 喷涂机; 控制软件; g代码; 图片格式转
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
城市周边自驾游短途路线
漫画作品与粉丝经济新模式