`
seyaa
  • 浏览: 55622 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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

阅读更多
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;
	}
	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类,如下:
package ce.dozer;
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;
	}
}

在给出的示例中我们可以看到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管理,配置如下:
<?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了解更多更深,建议到官网仔细阅读相关文档和说明!
官网:http://dozer.sourceforge.net/documentation/mappings.html
4
0
分享到:
评论

相关推荐

    dozer(PDF)

    ### Dozer:强大的Java Bean...总结起来,Dozer是一款非常实用的Java Bean映射工具,通过丰富的配置选项和灵活的使用方式,极大地简化了数据转换的过程。无论是初学者还是经验丰富的开发者,都可以从Dozer中受益匪浅。

    dozer的eclipse插件

    同时,它还会对映射规则进行实时验证,帮助你发现潜在的问题。 4. **预览与测试**: 在编辑过程中,你可以实时预览映射结果,查看对象转换的效果,这有助于调试和优化映射逻辑。 ### 提升开发效率 1. **自动化代码...

    dozer5.5.1 ( 可集成spring 及 OSGi )

    **标题解析:** ...总结来说,这个压缩包为开发者提供了一个完整的Dozer 5.5.1解决方案,包括了核心库、Spring集成扩展以及依赖关系的清单,使得在Spring和OSGi环境中使用Dozer变得更加便捷和高效。

    dozer5.3.2

    《Dozer 5.3.2:Java数据映射与校验利器...无论是在企业级应用还是小型项目中,Dozer都能成为你得力的助手,帮助你轻松应对数据转换和校验的挑战。通过深入理解和熟练使用,你将能够构建更加健壮和高效的数据处理系统。

    Dozer 使用

    总结来说,Dozer 是一个强大的对象映射库,这篇博客文章 "Dozer 使用" 会深入讲解其核心功能和用法,同时可能包含对源码的解读和实战案例,帮助开发者更好地理解和应用这个工具。而 "DozerBeanModule" 文件可能提供...

    Dozer详解

    Dozer是一款强大的Java到Java对象映射库,它可以帮助开发者在不同的对象模型之间进行数据转换。在处理复杂的数据结构时,Dozer提供了便捷的方式,减少了手动转换代码的工作量,使得代码更加简洁、可维护。Dozer不仅...

    springboot-dozer-sample:Spring Spring-boot和Dozer Java Libarary的简单示例

    而Dozer则是一款强大的对象映射库,它可以帮助我们在不同对象之间进行数据转换,极大地简化了开发工作。本示例项目“springboot-dozer-sample”旨在展示如何在Spring Boot应用中集成并使用Dozer库,实现数据映射功能...

    sandbox_dozer:尝试推土机豆映射库

    总结起来,"sandbox_dozer"项目是关于利用Dozer库进行bean映射的实践平台,它涵盖了注解、Java API和XML映射文件等多种映射方式。通过学习和应用这个项目,开发者可以提升自己在Java对象映射方面的技能,提高代码...

    Bull-Dozer-ML-Model:根据以前的数据预测推土机的价格

    这个模型旨在帮助行业参与者,如制造商、经销商和投资者,根据历史数据对推土机的未来售价进行准确的估算,从而优化决策过程。 在机器学习领域,预测模型通常涉及多个步骤,包括数据预处理、特征工程、模型选择与...

    DTO设计模式.docx

    总结来说,DTO设计模式是软件架构中的一种有效工具,它帮助我们管理复杂系统的数据传输,减少了不同层次之间的依赖,提高了代码的可维护性和扩展性。在实际开发中,我们需要根据具体的需求和场景,合理地使用DTO,以...

    领域驱动设计和开发实战

    在示例应用中,如贷款处理系统,可能使用的框架包括Spring、Dozer、Spring Security、JAXB、Arid POJOs 和 Spring Dynamic Modules,这些工具可以帮助实现和测试领域模型。 贫血模型,即只有getter和setter方法的...

    领域驱动设计和开发实战.pdf

    总结而言,领域驱动设计是一种强大的工具,可以帮助开发人员创建符合业务需求、易于维护和扩展的软件。通过深入理解和实践DDD,团队能够构建出更加健壮、灵活的系统,更好地应对业务变化,从而提高企业的竞争力。

    表单数据自动封装到javaBean中

    除了框架内置的功能,还有一些第三方库可以帮助简化这个过程,如Dozer、ModelMapper等,它们提供了一种更直观的方式来映射对象之间的属性。 8. **单元测试**: 对于封装逻辑,编写单元测试是非常重要的,确保无论...

    Spring SpringMVC mybatis框架搭建所需jar包

    总结来说,SSM框架的搭建涉及多个jar包,每个框架都有其特定的功能和作用。理解这些框架的工作原理和相互关系,以及它们所需的依赖,对于开发高质量的Java Web应用至关重要。正确配置和管理这些jar包,能够帮助...

Global site tag (gtag.js) - Google Analytics