天天看點

Dozer詳解 1       如何得到Dozer 工具類jar包 2       Dozer使用(不與spring內建下) 3       與spring的內建

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

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;

      }

}

在給出的示例中我們可以看到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)枚舉 類型不同

綜合上面的問題我們可以如下解決方式:

(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)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)自己編寫一個類來處理枚舉與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  1、dozer 要與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)