# PoToVo **Repository Path**: bfylu/PoToVo ## Basic Information - **Project Name**: PoToVo - **Description**: 对象转换工具(Dozer) - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-01-29 - **Last Updated**: 2022-01-29 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 对象转换工具(Dozer) ## url : https://github.com/bfylu/PoToVo * Dozer可以在JavaBean到JavaBean之间进行递归数据复制,并且这些JavaBean可以是不同的复杂的类型。 所有的mapping,Dozer将会很直接的将名称相同的fields进行复制,如果field名不同,或者有特别的对应要求,则可以在xml中进行定义。 dozer官网 : http://dozer.sourceforge.net/documentation/about.html * Maven: ```xml net.sf.dozer dozer 5.5.1 ``` ## 2 Dozer 支持的转换类型 Dozer支持 Primitive 基本数据类型 , 后面带 Wrapper 是包装类 Complex Type 是复杂类型 · Primitive to Primitive Wrapper · Primitive to Custom Wrapper · Primitive Wrapper to Primitive Wrapper · Primitive to Primitive · Complex Type to Complex Type · String to Primitive · String to Primitive Wrapper · String to Complex Type if the Complex Type contains a String constructor · String 到复杂类型 , 如果复杂类型包含一个 String 类型的构造器 · String to Map · Collection to Collection · Collection to Array · Map to Complex Type · Map to Custom Map Type · Enum to Enum · Each of these can be mapped to one another: java.util.Date, java.sql.Date, java.sql.Time, java.sql.Timestamp, java.util.Calendar, java.util.GregorianCalendar · String to any of the supported Date/Calendar Objects. · Objects containing a toString() method that produces a long representing time in (ms) to any supported Date/Calendar object. ## Dozer使用(不与spring集成下) ####3.1 dozer使用分类 * 根据有无映射文件和文件的多少,有三种方式 : ``` 第一种:该方式用于数据类型为基本类型,名称相同的对象映射 Mapper mapper = new DozerBeanMapper(); SourceObject sourceObject = new SourceObject(); DestinationObject destObject = (DestinationObject) mapper.map(sourceObject, DestinationObject.class); // or DestinationObject destObject = new DestinationObject(); mapper.map(sourceObject, destObject); 第二种:该方式用于数据类型不一致,或者名称不相同或者有级联关系等情况下的映射,该方式可以添加多个配置文件dozerBeanMapping.xml、someOtherDozerBeanMappings.xml 等 List myMappingFiles = new ArrayList(); myMappingFiles.add("dozerBeanMapping.xml"); //myMappingFiles.add("someOtherDozerBeanMappings.xml"); DozerBeanMapper mapper = new DozerBeanMapper(); SourceObject sourceObject = new SourceObject(); mapper.setMappingFiles(myMappingFiles); DestinationObject stObject= (DestinationObject) mapper.map(sourceObject, DestinationObject.class); 第三种:该方式用于数据类型不一致,或者名称不相同或者有级联关系等情况下的映射,配置文件只有一个映射文件叫dozerBeanMapping.xml且在根目录下 Mapper mapper = DozerBeanMapperSingletonWrapper.getInstance(); SourceObject sourceObject = new SourceObject(); DestinationObject destObject = (DestinationObject) mapper.map(sourceObject, DestinationObject.class); //or //Mapper mapper = DozerBeanMapperSingletonWrapper.getInstance(); //DestinationObject destObject = new DestinationObject(); mapper.map(sourceObject, destObject); ``` ####3.2 举例说明: * userDo类: ```java package top.bfylu; /** * userDo类 * @author bfy--lujian * @version 1.0.0 * 创建时间:2018/8/14 18:04 * @email bfyjian@gmail.com */ public class User { private int id; private String name; private String password; private Info info; private String age; public String getAge() { return age; } public void setAge(String age) { this.age = age; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public Info getInfo() { return info; } public void setInfo(Info info) { this.info = info; } } ``` * userVo类: ```java package top.bfylu; /** * 一个userVo类 * @author bfy--lujian * @version 1.0.0 * 创建时间:2018/8/14 18:05 * @email bfyjian@gmail.com */ public class UserVo { private int id; private String userName; private String password; private InfoVo info; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public InfoVo getInfo() { return info; } public void setInfo(InfoVo info) { this.info = info; } } ``` * 一个性別枚举类 ```java package top.bfylu; /** * 一个性別枚举类 * @author bfy--lujian * @version 1.0.0 * 创建时间:2018/8/14 18:05 * @email bfyjian@gmail.com */ public enum GenderType { male, //男 famele //女 } ``` * 一个infoDo类: ```java package top.bfylu; import java.util.Date; /** * 一个infoDo类 * @author bfy--lujian * @version 1.0.0 * 创建时间:2018/8/14 18:08 * @email bfyjian@gmail.com */ public class Info { private int id; private Date createDate; private GenderType gender; public int getId() { return id; } public void setId(int id) { this.id = id; } public Date getCreateDate() { return createDate; } public void setCreateDate(Date createDate) { this.createDate = createDate; } public GenderType getGender() { return gender; } public void setGender(GenderType gender) { this.gender = gender; } } ``` * 一个infoVo类 ```java package top.bfylu; /** * 一个infoVo类 * @author bfy--lujian * @version 1.0.0 * 创建时间:2018/8/14 18:09 * @email bfyjian@gmail.com */ public class InfoVo { private int id; private String date; private Integer gender; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getDate() { return date; } public void setDate(String date) { this.date = date; } public Integer getGender() { return gender; } public void setGender(Integer gender) { this.gender = gender; } } ``` * Test测试类 ```java package top.bfylu; import org.dozer.DozerBeanMapper; import org.dozer.Mapper; /** * @author bfy--lujian * @version 1.0.0 * 创建时间:2018/8/14 18:13 * @email bfyjian@gmail.com */ public class Test { public static void main(String[] arge) { Mapper mapper = new DozerBeanMapper(); User user = new User(); user.setId(1); user.setAge("18"); user.setName("bfylu"); user.setPassword("lu123456"); UserVo userVo = (UserVo) mapper.map(user,UserVo.class); System.out.println("password==>>" + userVo.getPassword()); } } ``` ####3.2.1 字段名称不同映射配置: ```xml ce.dozer.User ce.dozer.UserVO name userName ``` * 3.2.2 User与UserVo的Date映射配置如下: ```xml ce.dozer.User ce.dozer.UserVO info.createDate info.date ``` * 3.2.3 在示例中我们看到在userDo和userVo对象中关联了其他的对象,这个问题不用担心,因为对象名称相同dozer会为我们自动转换。而问题 不在这,在与对象中有枚举类型,我们该怎么写配置呢?在这里我们就必须自己编写一个处理类来处理枚举与Integer的转换了(假设我们的处理类 为util.EnumIntConverter),配置如下: ```xml true yyyy-MM-dd true java.lang.Enum java.lang.Integer ce.dozer.User ce.dozer.UserVO info.gender info.gender ``` * 最终的dozerBeanMapping.xml 配置文件: ```xml true yyyy-MM-dd true java.lang.Enum java.lang.Integer top.bfylu.User top.bfylu.UserVo info.createDate info.date info.gender info.gender info.createDate info.date name userName ``` ## 4 与spring的集成 ####4.1 1、dozer 要与spring集成需要将dozer交给spring管理,配置如下: ```xml classpath*:dozer-config/dozerBeanMapping.xml ``` ####4.2 2、当我们的dozer交给了spring管理,当spring容器启动后我们可以将下面的代码添加到用于继承的基类中去: ``` private Mapper mapper ; public Mapper getMapper() { return mapper; } public void setMapper(Mapper mapper) { this.mapper = mapper; } ``` ####4.3 3、在继承者类中就可以直接如下使用 ``` getMapper().map(sourceObject, DestinationObject.class) ```