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

Dozer使用总结

阅读更多

Dozer使用总结

 

1       概念

1.1  什么是dozer

Dozer 是一个对象转换工具。

Dozer可以在JavaBeanJavaBean之间进行递归数据复制,并且这些JavaBean可以是不同的复杂的类型。

所有的mappingDozer将会很直接的将名称相同的fields进行复制,如果field名不同,或者有特别的对应要求,则可以在xml中进行定义。

更多详细请参考dozer官网http://dozer.sourceforge.net/documentation/about.html

1.2  为什么要使用Dozer

分析多层架构的J2EE系统,经常存在JavaBean直接的拷贝。比如我们在DAO层,通过Do取得业务层需要的数据,将这些数据传递给 Service层的VODoVO就存在典型的值拷贝。

典型的解决方案就是手动拷贝,弊端很明显,代码中充斥大量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.xmlsomeOtherDozerBeanMappings.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        DateString映射配置如下:

 

<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        在示例中我们看到在userDouserVo对象中关联了其他的对象,这个问题不用担心,因为对象名称相同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  1dozer 要与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了解更多更深,建议到官网仔细阅读相关文档和说明!

官网:http://dozer.sourceforge.net/documentation/mappings.html

分享到:
评论

相关推荐

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

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

    dozer的使用实例

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

    dozer(PDF)

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

    dozer的eclipse插件

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

    Dozer 使用

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

    dozer5.2 jar包

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

    dozer5.5.1 ( 可集成spring 及 OSGi )

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

    Dozer详解

    总结来说,Dozer作为一款强大的对象映射工具,提供了丰富的映射功能,简化了Java对象间的转换工作。通过灵活的配置和自定义转换器,开发者可以应对各种复杂的映射需求。然而,在选择使用Dozer时,也应考虑其可能存在...

    dozer5.3.2

    总结来说,Dozer 5.3.2是一款功能强大的Java数据映射和校验工具,它通过灵活的映射规则、Groovy脚本支持以及内置的校验机制,大大提升了开发效率。无论是在企业级应用还是小型项目中,Dozer都能成为你得力的助手,...

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

    总结,Spring Boot与Dozer的结合,为Java开发者提供了便捷的对象转换解决方案。通过理解并掌握这两个工具的整合,可以有效提升开发效率,使项目更加健壮和易于维护。这个示例项目“springboot-dozer-sample”为学习...

    sandbox_dozer:尝试推土机豆映射库

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

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

    总结起来,Bull-Dozer-ML-Model 主要涵盖了机器学习流程的各个环节,从数据预处理到模型构建、评估和应用,体现了数据科学在预测领域的应用。Jupyter Notebook的使用则提供了一个直观且交互式的环境,便于分享和复现...

    DTO设计模式.docx

    3. **自动转换工具**:手动编写转换代码可能会导致大量的重复工作,可以使用一些库(如Dozer,MapStruct等)来自动化这个过程。 4. **性能优化**:如果数据量很大,可以考虑使用流式处理或批量转换,减少内存消耗。 ...

    java的excel解析

    例如,你可以使用Java的反射机制和对象映射库如Dozer或ModelMapper将Excel数据转换为Java对象,然后存储在数据库中。 在实际应用中,我们可能还会遇到性能优化的问题,因为大型Excel文件可能导致内存消耗过大。这时...

    BeanUtils工具包

    虽然BeanUtils提供了方便的功能,但在大量属性复制或性能敏感的场景下,可以考虑使用Dozer、ModelMapper等更高级的映射库,它们提供了更丰富的映射规则和更好的性能。 总结,BeanUtils工具包是Java开发中的一个利器...

    cn.rar_java xml to bea_java commonUt_xml to be_xml to bean

    在实际应用中,除了JAXB,还可以使用其他库如`DOM`, `SAX`, `StAX`等解析XML,或者使用第三方库如Apache Commons BeanUtils或Dozer进行Bean之间的映射。这些库各有优缺点,开发者需要根据项目需求选择合适的解决方案...

    Map 转为Object Object 转为 Map java jdk1.4以上

    请注意,以上代码没有处理嵌套的对象或集合类型,对于复杂的数据结构,你可能需要递归处理或者使用第三方库如Apache Commons BeanUtils或Dozer。 **使用示例** ```java Map, Object&gt; map = new HashMap(); map.put...

    orika Java实例Demo

    - **性能**:Orika的映射性能优于其他类似的库,如Dozer,对于大量数据转换尤其有利。 ### 3. 使用Orika的步骤 - **添加依赖**:在项目中引入Orika的Maven或Gradle依赖。 - **创建MapperFactory**:这是Orika的...

Global site tag (gtag.js) - Google Analytics