Dozer使用总结
1 概念
1.1 什么是dozer?
Dozer 是一个对象转换工具。
Dozer可以在JavaBean到JavaBean之间进行递归数据复制,并且这些JavaBean可以是不同的复杂的类型。
所有的mapping,Dozer将会很直接的将名称相同的fields进行复制,如果field名不同,或者有特别的对应要求,则可以在xml中进行定义。
更多详细请参考dozer官网:http://dozer.sourceforge.net/documentation/about.html
1.2 为什么要使用Dozer?
分析多层架构的J2EE系统,经常存在JavaBean直接的拷贝。比如我们在DAO层,通过Do取得业务层需要的数据,将这些数据传递给 Service层的VO。Do与VO就存在典型的值拷贝。
典型的解决方案就是手动拷贝,弊端很明显,代码中充斥大量Set 和Get方法,真正的业务被埋藏值与值的拷贝之中。另一种方案就是使用BeanUtil,但BeanUtil不够很好的灵活性,又时候还不得不手动拷贝。Dozer可以灵活的对对象进行转换,且使用简单。
注意:Dozer支持简单类型 复杂类型的双向递归映射。
1.3 如何得到Dozer 工具类jar包
1.点击下载:http://sourceforge.net/projects/dozer/files/
2.如果使用maven工具的话,在pom.Xml文件中加入:
<dependency>
<groupId>net.sf.dozer</groupId>
<artifactId>dozer</artifactId>
<version>5.2.1</version>
</dependency>
加入你的构建路径既可以使用。
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.
3 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类,如下:
package ce.dozer;
public class User {
private int id;
private String name;
private String password;
private Info info;
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类,如下:
package ce.dozer;
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;
}
}
一个性別枚舉类,如下:
package ce.dozer;
public enum GenderType {
male,//男
female//女
}
一个infoDo类,如下:
package ce.dozer;
import java.util.Date;
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;
}
~~~~~~set\get~~~~~~~
一个infoVo类,如下:
package ce.dozer;
public class InfoVO {
private int id;
private String date;
private Integer gender;
public int getId() {
return id;
}
在给出的示例中我们可以看到userDo与 userVo 中的字段对应关系
userVo | userDo | 不同 |
id(int) | id(int) | |
userName(String) | name(String) | 名称不同 |
password(String) | password(String) | |
Info(InfoVo) | Info(Info) | 类型不同 |
再看看infoDo与 infoVo 中的字段对应关系
综合上面的问题我们可以如下
infoVo | infoDo | 不同 |
id(int) | id(int) | |
createDate(String) | date(Date) | 类型不同 |
gender(Integer) | gender(GenderType)枚举 | 类型不同 |
解决方式:
3.2.1 字段名称不同映射配置
<mapping>
<class-a>ce.dozer.User</class-a>
<class-b>ce.dozer.UserVO</class-b>
<field>
<a>name</a>
<b>userName</b>
</field>
</mapping>
3.2.2 Date与String映射配置如下:
<mapping date-format="yyyy-MM-dd">
<class-a>ce.dozer.User</class-a>
<class-b>ce.dozer.UserVO</class-b>
<field>
<a>info.createDate</a>
<b>info.date</b>
</field>
</mapping>
3.2.3 在示例中我们看到在userDo和userVo对象中关联了其他的对象,这个问题不用担心,因为对象名称相同dozer会为我们自动转换。而问题不在这,在与对象中有枚举类型,我们该怎么写配置呢?在这里我们就必须自己编写一个处理类来处理枚举与Integer的转换了(假设我们的处理类为util.EnumIntConverter),配置如下:
<configuration>
<stop-on-errors>true</stop-on-errors>
<date-format>yyyy-MM-dd</date-format>
<wildcard>true</wildcard>
<custom-converters>
<converter type=" util.EnumIntConverter">
<class-a>java.lang.Enum</class-a>
<class-b>java.lang.Integer</class-b>
</converter>
</custom-converters>
</configuration>
<mapping>
<class-a>ce.dozer.User</class-a>
<class-b>ce.dozer.UserVO</class-b>
<field>
<a>info.gender</a>
<b>info.gender</b>
</field>
</mapping>
最终的dozerBeanMapping.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">
<configuration>
<stop-on-errors>true</stop-on-errors>
<date-format>yyyy-MM-dd</date-format>
<wildcard>true</wildcard>
<custom-converters>
<converter type=" util.EnumIntConverter">
<class-a>java.lang.Enum</class-a>
<class-b>java.lang.Integer</class-b>
</converter>
</custom-converters>
</configuration>
<mapping date-format="yyyy-MM-dd">
<class-a>ce.dozer.User</class-a>
<class-b>ce.dozer.UserVO</class-b>
<field>
<a>info.createDate</a>
<b>info.date</b>
</field>
<field>
<a>info.gender</a>
<b>info.gender</b>
</field>
<field>
<a>info.createDate</a>
<b>info.date</b>
</field>
<field>
<a>name</a>
<b>userName</b>
</field>
</mapping>
</mappings>
4 与spring的集成
4.1 1、dozer 要与spring集成需要将dozer交给spring管理,配置如下:
spring-dozer.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd"
default-autowire="byName" default-lazy-init="false">
<bean id="mapper" class="org.dozer.spring.DozerBeanMapperFactoryBean">
<property name="mappingFiles">
<list> <value>classpath*:dozer-config/dozerBeanMapping.xml</value>
</list>
</property>
</bean>
</beans>
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)
5 结束语
Dozer的转换功能很强大,我们所能想到的类型转换,它基本都可以帮助我们完成。所以如果您想对dozer了解更多更深,建议到官网仔细阅读相关文档和说明!
相关推荐
在这个总结中,我们将深入探讨 Dozer 的核心功能、使用场景以及如何在项目中有效地利用它。 首先,让我们理解什么是对象映射。对象映射是一种编程技术,用于在不同数据模型之间转换数据。例如,从数据库记录到业务...
**Dozer库详解与使用实例** Dozer是一个强大的Java Bean到Java Bean映射库,它极大地简化了对象之间的数据转换工作。与Apache的BeanUtils相比,Dozer提供了更高级别的抽象,灵活性更高,并且能够更好地处理复杂的...
### Dozer:强大的Java Bean...总结起来,Dozer是一款非常实用的Java Bean映射工具,通过丰富的配置选项和灵活的使用方式,极大地简化了数据转换的过程。无论是初学者还是经验丰富的开发者,都可以从Dozer中受益匪浅。
1. **映射编辑器**: 使用Dozer Eclipse插件,你可以通过图形界面创建和编辑映射规则。只需右键点击项目中的Dozer配置文件(如`dozer.xml`),选择`Open With -> Dozer Mapper Editor`,就可以打开可视化的映射编辑器...
总结来说,Dozer 是一个强大的对象映射库,这篇博客文章 "Dozer 使用" 会深入讲解其核心功能和用法,同时可能包含对源码的解读和实战案例,帮助开发者更好地理解和应用这个工具。而 "DozerBeanModule" 文件可能提供...
**标题解析:** ...总结来说,这个压缩包为开发者提供了一个完整的Dozer 5.5.1解决方案,包括了核心库、Spring集成扩展以及依赖关系的清单,使得在Spring和OSGi环境中使用Dozer变得更加便捷和高效。
**标题与描述解析** 标题中的"dozer5.2 jar包"指的是Dozer库的5.2版本,这是一个Java库,主要用于对象之间的映射。...使用Dozer可以极大地减少手动复制对象属性的工作,使开发者能够专注于业务逻辑的实现。
总结来说,Dozer作为一款强大的对象映射工具,提供了丰富的映射功能,简化了Java对象间的转换工作。通过灵活的配置和自定义转换器,开发者可以应对各种复杂的映射需求。然而,在选择使用Dozer时,也应考虑其可能存在...
总结来说,Dozer 5.3.2是一款功能强大的Java数据映射和校验工具,它通过灵活的映射规则、Groovy脚本支持以及内置的校验机制,大大提升了开发效率。无论是在企业级应用还是小型项目中,Dozer都能成为你得力的助手,...
总结,Spring Boot与Dozer的结合,为Java开发者提供了便捷的对象转换解决方案。通过理解并掌握这两个工具的整合,可以有效提升开发效率,使项目更加健壮和易于维护。这个示例项目“springboot-dozer-sample”为学习...
总结起来,"sandbox_dozer"项目是关于利用Dozer库进行bean映射的实践平台,它涵盖了注解、Java API和XML映射文件等多种映射方式。通过学习和应用这个项目,开发者可以提升自己在Java对象映射方面的技能,提高代码...
总结起来,Bull-Dozer-ML-Model 主要涵盖了机器学习流程的各个环节,从数据预处理到模型构建、评估和应用,体现了数据科学在预测领域的应用。Jupyter Notebook的使用则提供了一个直观且交互式的环境,便于分享和复现...
3. **自动转换工具**:手动编写转换代码可能会导致大量的重复工作,可以使用一些库(如Dozer,MapStruct等)来自动化这个过程。 4. **性能优化**:如果数据量很大,可以考虑使用流式处理或批量转换,减少内存消耗。 ...
例如,你可以使用Java的反射机制和对象映射库如Dozer或ModelMapper将Excel数据转换为Java对象,然后存储在数据库中。 在实际应用中,我们可能还会遇到性能优化的问题,因为大型Excel文件可能导致内存消耗过大。这时...
虽然BeanUtils提供了方便的功能,但在大量属性复制或性能敏感的场景下,可以考虑使用Dozer、ModelMapper等更高级的映射库,它们提供了更丰富的映射规则和更好的性能。 总结,BeanUtils工具包是Java开发中的一个利器...
在实际应用中,除了JAXB,还可以使用其他库如`DOM`, `SAX`, `StAX`等解析XML,或者使用第三方库如Apache Commons BeanUtils或Dozer进行Bean之间的映射。这些库各有优缺点,开发者需要根据项目需求选择合适的解决方案...
请注意,以上代码没有处理嵌套的对象或集合类型,对于复杂的数据结构,你可能需要递归处理或者使用第三方库如Apache Commons BeanUtils或Dozer。 **使用示例** ```java Map, Object> map = new HashMap(); map.put...
- **性能**:Orika的映射性能优于其他类似的库,如Dozer,对于大量数据转换尤其有利。 ### 3. 使用Orika的步骤 - **添加依赖**:在项目中引入Orika的Maven或Gradle依赖。 - **创建MapperFactory**:这是Orika的...