`
zhuchengzzcc
  • 浏览: 441808 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Dozer小试

    博客分类:
  • java
阅读更多

 

一、简介

       分析多层架构的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世纪]

分享到:
评论

相关推荐

    dozer的使用实例

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

    dozer小例子-bean复制

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

    dozer的eclipse插件

    **Dozer Eclipse插件**是面向Java开发人员的一款强大工具,尤其在进行对象-对象映射(Object-Object Mapping)时能提供巨大的便利。Dozer是一个开源库,它简化了Java对象之间的数据转换过程,而Dozer Eclipse插件则...

    dozer复杂类型测试类.zip

    《Dozer复杂类型测试类详解》 在Java开发中,数据对象之间的映射是一个常见的需求,比如在服务层与表示层之间,或是不同系统间的数据交换。Dozer是一款强大的Java Bean到Java Bean映射库,它能自动进行复杂的对象...

    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文档-...

    dozer5.2 jar包

    标题中的"dozer5.2 jar包"指的是Dozer库的5.2版本,这是一个Java库,主要用于对象之间的映射。它简化了Java对象到Java对象,甚至Java对象到XML文档之间的数据转换过程。Dozer不仅支持简单的属性映射,还支持复杂的...

    dozer(PDF)

    ### Dozer:强大的Java Bean映射工具 #### 一、简介与下载 Dozer是一款功能强大但使用简单的Java Bean到Java Bean映射工具,能够递归地从一个对象复制数据到另一个对象。通常,这些Java Beans会是不同复杂度的类型...

    javaEE的对象拷贝工具dozer

    Java EE对象拷贝工具Dozer是一款强大的数据映射库,它简化了在Java对象之间进行深度复制的过程。在软件开发中,特别是在业务层处理数据时,我们经常需要将一个对象的属性值复制到另一个对象中,Dozer提供了一个优雅...

    dozer-user-guide

    Dozer是一个JavaBean的映射工具,用于在Java对象之间转换属性值。它类似于Apache的BeanUtils,但Dozer特别优化了复杂对象的映射,可以将一个对象的字段映射到另一个对象,这在分层架构中尤其有用。在分层架构中,...

    dozer5.5.1 ( 可集成spring 及 OSGi )

    "dozer5.5.1 ( 可集成spring 及 OSGi )" 指的是Dozer库的一个特定版本,即5.5.1,它具有与Spring框架和OSGi容器集成的能力。这意味着开发人员可以将Dozer作为数据映射工具,在这些环境中无缝地使用。 **描述解析:*...

    dozer-5.3.2-src.zip

    《Dozer:强大的JavaBean映射工具》 在Java开发中,对象间的属性映射是一项常见的任务,尤其是在数据转换和接口交互中。Apache的BeanUtils是这类问题的一个基础解决方案,但当面临更复杂的映射需求时,其功能就显得...

    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

    Dozer详解

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

    dozer5.3.2

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

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

    Dozer 是一个强大的 Java 对象映射框架,它简化了对象到对象之间的转换工作,尤其在处理复杂的数据结构时。这个工具广泛应用于企业级应用,因为它可以极大地减少手动编写转换代码的工作量。在这个总结中,我们将深入...

    Dozer 使用

    **Dozer 使用详解** Dozer 是一个开源的 Java 对象到对象映射库,它能够帮助开发者在 Java 应用程序中将一个对象模型映射到另一个对象模型。这个工具在处理复杂的数据转换时非常有用,尤其是在数据绑定、数据复制...

    org.dozer JAR 包(实现java bean mapper)

    dozer是一款优秀的java bean映射开源框架,完成深度转换Bean&lt;-&gt;Bean的Mapper实现

Global site tag (gtag.js) - Google Analytics