`

Dozer 使用

    博客分类:
  • Java
 
阅读更多

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其实底层使用了现成的BeanUtil,通过反射来映射,况且Dozer应用了Cache技术,应该比自个通过BeanUtils映射性能要好点。所以一般的应用应该不存在性能问题。
注意:Dozer支持简单类型 复杂类型的双向递归映射。
1.3 如何得到Dozer 工具类jar包

    1. 点击下载:http://sourceforge.net/projects/dozer/files/

       本文中使用的版本是dozer-5.3.2

    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 举例说明:

假设我们现在有一个userVo类,如下:

/**
 * 
 */
package com.wy.bean;

/**
 * @author wy
 *
 */
public class UserVO {
	private int id;
	private String userName;
	private String password;
	private InfoVO infoVo;
	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 getInfoVo() {
		return infoVo;
	}
	public void setInfoVo(InfoVO infoVo) {
		this.infoVo = infoVo;
	}
	@Override
	public String toString() {
		return "UserVO [id=" + id + ", userName=" + userName + ", password="
				+ password + ", infoVo=" + infoVo + "]";
	}
	
}

 一个User类,如下:

/**
 * 
 */
package com.wy.bean;

/**
 * @author wy
 * 
 */
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;
	}

	@Override
	public String toString() {
		return "User [id=" + id + ", name=" + name + ", password=" + password
				+ ", info=" + info + "]";
	}
	
	
}

 一个InfoVo类,如下:

/**
 * 
 */
package com.wy.bean;

/**
 * @author wy
 * 
 */
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;
	}

	@Override
	public String toString() {
		return "InfoVO [id=" + id + ", date=" + date + ", gender=" + gender
				+ "]";
	}
	
}

 一个Info类,如下:

/**
 * 
 */
package com.wy.bean;

/**
 * @author wy
 *
 */
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;
	}
	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;
	}
	@Override
	public String toString() {
		return "Info [id=" + id + ", createDate=" + createDate + ", gender="
				+ gender + "]";
	}
	
}

 一个枚举类,如下:

package com.wy.bean;

public enum GenderType {
	male,//男
	female//女
}

 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="com.wy.util.EnumIntConverter">
				<class-a>java.lang.Enum</class-a>
				<class-b>java.lang.Integer</class-b>
			</converter>
		</custom-converters>
	</configuration>
	<!--Date与String映射配置-->
	<mapping date-format="yyyy-MM-dd hh:mm:ss">
		<class-a>com.wy.bean.User</class-a>
		<class-b>com.wy.bean.UserVO</class-b>
		
		<field>
			<a>info.createDate</a>
			<b>infoVo.date</b>
		</field>
		<field>
			<a>info.gender</a>
			<b>infoVo.gender</b>
		</field>
		<!-- 字段名称不同映射配置  -->
		<field>
			<a>name</a>
			<b>userName</b>
		</field>
	</mapping>
</mappings>

 EnumIntConverter类,如下:

/**
 * 
 */
package com.wy.util;

import org.dozer.CustomConverter;

import com.wy.bean.GenderType;

/**
 * @author wy
 * 
 */
public class EnumIntConverter implements CustomConverter {

	public Object convert(Object destinationFieldValue, Object sourceFieldValue, Class<?> destinationClass, Class<?> sourceClass) {
		Object returnVale = null;
		if (sourceFieldValue != null) {
			if (sourceFieldValue instanceof Integer) {
				if ((Integer) sourceFieldValue == 0) {
					returnVale = GenderType.male;
				} else if ((Integer) sourceFieldValue == 1) {
					returnVale = GenderType.female;
				}
			} else if (sourceFieldValue instanceof Enum) {
				if (sourceFieldValue == GenderType.male) {
					returnVale = 0;
				} else if (sourceFieldValue == GenderType.female) {
					returnVale = 1;
				}
			}
		}
		return returnVale;
	}

}

 

4 与spring的集成
4.1 1、dozer 要与spring集成需要将dozer交给spring管理,配置如下:

<?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"
	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"
	default-autowire="byName" default-lazy-init="false">

	<bean id="mapper" class="org.dozer.spring.DozerBeanMapperFactoryBean">
		<property name="mappingFiles">
			<list>
				<value>classpath*: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.33、在继承者类中就可以直接如下使用:  

getMapper().map(sourceObject, DestinationObject.class)

 5 结束语

Dozer的转换功能很强大,我们所能想到的类型转换,它基本都可以帮助我们完成。所以如果您想对dozer了解更多更深,建议到官网仔细阅读相关文档和说明!
官网:http://dozer.sourceforge.net/documentation/mappings.html

 

 

转载:http://seyaa.iteye.com/blog/762494

 

 

 

 

 

分享到:
评论

相关推荐

    Dozer 使用总结,也许对你有帮助

    在这个总结中,我们将深入探讨 Dozer 的核心功能、使用场景以及如何在项目中有效地利用它。 首先,让我们理解什么是对象映射。对象映射是一种编程技术,用于在不同数据模型之间转换数据。例如,从数据库记录到业务...

    dozer(PDF)

    Dozer是一款功能强大但使用简单的Java Bean到Java Bean映射工具,能够递归地从一个对象复制数据到另一个对象。通常,这些Java Beans会是不同复杂度的类型。 **1.1 下载** Dozer可以方便地通过其官方网站进行下载。...

    Dozer小试

    "dozer-demo"这个文件名很可能指的是包含一个Dozer使用示例的项目。该项目可能包含了配置文件、源代码和测试用例,用于演示如何在实际项目中应用Dozer。通过这个示例,学习者可以更直观地了解如何在实际开发中集成和...

    dozer的使用实例

    **Dozer库详解与使用实例** Dozer是一个强大的Java Bean到Java Bean映射库,它极大地简化了对象之间的数据转换工作。与Apache的BeanUtils相比,Dozer提供了更高级别的抽象,灵活性更高,并且能够更好地处理复杂的...

    dozer小例子-bean复制

    在这个"dozer小例子-bean复制"中,我们将深入探讨Dozer库的使用方法以及它如何帮助我们高效地完成bean复制。 首先,Dozer的核心功能是提供对象之间的自动映射。在Java中,手动复制bean可能会导致代码冗余且易出错,...

    dozer的eclipse插件

    1. **映射编辑器**: 使用Dozer Eclipse插件,你可以通过图形界面创建和编辑映射规则。只需右键点击项目中的Dozer配置文件(如`dozer.xml`),选择`Open With -&gt; Dozer Mapper Editor`,就可以打开可视化的映射编辑器...

    dozer-5.5.1-API文档-中文版.zip

    赠送jar包:dozer-5.5.1.jar; 赠送原API文档:dozer-5.5.1-javadoc.jar; 赠送源代码:dozer-5.5.1-sources.jar; 赠送Maven依赖信息文件:dozer-5.5.1.pom; 包含翻译后的API文档:dozer-5.5.1-javadoc-API文档-...

    dozer-5.5.1-API文档-中英对照版.zip

    赠送jar包:dozer-5.5.1.jar; 赠送原API文档:dozer-5.5.1-javadoc.jar; 赠送源代码:dozer-5.5.1-sources.jar; 赠送Maven依赖信息文件:dozer-5.5.1.pom; 包含翻译后的API文档:dozer-5.5.1-javadoc-API文档-...

    dozer-user-guide

    Dozer是一个JavaBean的映射工具,用于在Java对象之间转换属性值。它类似于Apache的BeanUtils,但Dozer...对于常见的疑问(FAQ),Dozer的官方文档也提供了解答,以便用户能够更快地上手并解决在使用过程中遇到的问题。

    dozer复杂类型测试类.zip

    《Dozer复杂类型测试类详解》 在Java开发中,数据对象之间的映射是一个常见的需求,比如在服务层与表示层之间,或是不同系统间的数据...在实际开发中,熟练掌握Dozer的使用,能够显著提升项目开发的效率和代码质量。

    javaEE的对象拷贝工具dozer

    2. 定义映射规则:Dozer支持两种方式定义映射规则,一种是使用XML配置文件,另一种是在代码中使用注解。XML配置文件可以集中管理所有映射规则,而注解则更适用于小规模的项目或者特定类的映射。 3. 执行映射:有了...

    dozer5.5.1 ( 可集成spring 及 OSGi )

    描述中提到,"dozer5.5.1 ( 可集成spring 及 OSGi ) , 不论在spring及osgi 下均可使用",意味着该版本的Dozer不仅兼容Spring框架,也支持OSGi服务框架。这使得开发者在基于Spring的应用程序或者使用OSGi模块化系统时...

    dozer5.2 jar包

    **标题与描述解析** 标题中的"dozer5.2 jar包"指的是Dozer库的5.2版本,这是一个Java库,主要用于对象之间的映射。...使用Dozer可以极大地减少手动复制对象属性的工作,使开发者能够专注于业务逻辑的实现。

    dozer-5.3.2-src.zip

    《Dozer:强大的JavaBean映射工具》 在Java开发中,对象间的属性映射是一项常见的任务,尤其是在数据转换和...通过深入学习和使用Dozer,开发者不仅可以掌握一种实用的工具,还能提升自己在对象映射领域的专业技能。

    Dozer详解

    在项目中使用Dozer,首先需要将其依赖添加到构建工具中。对于Maven项目,可以在`pom.xml`文件中添加以下依赖: ```xml &lt;groupId&gt;com.github.dozermapper&lt;/groupId&gt; &lt;artifactId&gt;dozer &lt;version&gt;6.5.2 ``` ###...

    dozer-5.5.1.jar

    dozer-5.5.1.jar dozer-5.5.1.jar dozer-5.5.1.jar dozer-5.5.1.jar

    dozer5.3.2

    《Dozer 5.3.2:Java数据映射与校验利器》 在Java开发领域,数据转换和校验是常见的任务,尤其在处理不同系统间的数据交换时。Dozer是一个强大的开源库,专为解决此类问题而设计。本文将深入探讨Dozer 5.3.2版本的...

Global site tag (gtag.js) - Google Analytics