Dozer详解

1       如何得到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使用(不与spring集成下)

2.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);

 

2.2  举例说明:

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

package ce.dozer;

publicclass User {

      privateintid;

      private String name;

      private String password;

      private Info info;

      publicint getId() {

            returnid;

      }

      publicvoid setId(int id) {

            this.id = id;

      }

      public String getName() {

            returnname;

      }

      publicvoid setName(String name) {

            this.name = name;

      }

      public String getPassword() {

            returnpassword;

      }

      publicvoid setPassword(String password) {

            this.password = password;

      }

      public Info getInfo() {

            returninfo;

      }

      publicvoid setInfo(Info info) {

            this.info = info;

      }

}

一个userVo类,如下:

package ce.dozer;

publicclass UserVO {

      privateintid;

      private String userName;

      private String password;

      private InfoVO info;

      publicint getId() {

            returnid;

      }

      publicvoid setId(int id) {

            this.id = id;

      }

      public String getUserName() {

            returnuserName;

      }

      publicvoid setUserName(String userName) {

            this.userName = userName;

      }

      public String getPassword() {

            returnpassword;

      }

      publicvoid setPassword(String password) {

            this.password = password;

      }

      public InfoVO getInfo() {

            returninfo;

      }

      publicvoid setInfo(InfoVO info) {

            this.info = info;

      }

}

一个性別枚舉类,如下:

package ce.dozer;

publicenum GenderType {

      male,//

      female//

}

一个infoDo类,如下:

package ce.dozer;

import java.util.Date;

publicclass Info {

      privateintid;

      private Date createDate;

      private GenderType gender;

      publicint getId() {

            returnid;

      }

      publicvoid setId(int id) {

            this.id = id;

      }

      public Date getCreateDate() {

            returncreateDate;

      }

      publicvoid setCreateDate(Date createDate) {

            this.createDate = createDate;

      }

      public GenderType getGender() {

            returngender;

      }

      publicvoid setGender(GenderType gender) {

            this.gender = gender;

      }

}

一个infoVo类,如下:

package ce.dozer;

publicclass InfoVO {

      privateintid;

      private String date;

      private Integer gender;

      publicint getId() {

            returnid;

      }

      publicvoid setId(int id) {

            this.id = id;

      }

      public String getDate() {

            return date;

      }

      publicvoid setDate(String date) {

            this.date = date;

      }

      public Integer getGender() {

            returngender;

      }

      publicvoid setGender(Integer gender) {

            this.gender = gender;

      }

}

在给出的示例中我们可以看到userDouserVo 中的字段对应关系

userVo

userDo

不同

idint

idint

 

userNameString

nameString

名称不同

passwordString

passwordString

 

Info(InfoVo)

info (Info)

类型不同

再看看infoDo infoVo 中的字段对应关系

infoVo

infoDo

不同

id(int)

Id(int)

 

createDate(String)

date(Date)

类型不同

gender(Integer)

Gender(GenderType)枚举

类型不同

综合上面的问题我们可以如下解决方式:

(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>

(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)自己编写一个类来处理枚举与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>

 

 

3       spring的集成

3.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>

3.2  2、当我们的dozer交给了spring管理,当spring容器启动后我们可以将下面的代码添加到用于继承的基类中去:

private Mapper mapper ;

public Mapper getMapper() {

      returnmapper;

}

publicvoid setMapper(Mapper mapper) {

      this.mapper = mapper;

}

3.3  3、在继承者类中就可以直接如下使用:

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

你可能感兴趣的:(详解)