Dozer 對象的"搬運工"

前言:項目中,常常會遇到各層對象之間相互進行值傳遞的過程,如在數據據持久層有一持久類EntityA,在視圖層可能會變爲ViewA,一般狀況下,這兩個類的屬性 名稱 、類型都是一致的,spring

    在兩個對象傳值的過程當中,有幾種辦法:apache

    1.最基本的set(),get()方法,當對象的屬性有不少時,會產生大量的代碼
app

    2.apache的common-beanutils.jar 下 BeanUtils().copyProperties(obj1,obj2)工具

    3.dozer性能

本文主要介紹dozer的用法
學習

1.簡介
    dozer是一種JavaBean的映射工具,相似於apache的BeanUtils。可是dozer更強大,它能夠靈活的處理複雜類型之間的映射。不但能夠進行簡單的屬性映射、複雜的類型映射、
測試

    雙向映射、遞歸映射等,而且能夠 經過XML配置文件進行靈活的配置。spa

    使用Dozer映射覆雜類型:1. 數據類型不一致。 2. 級聯映射。 3. 自定義映射。.net

   Dozer其實底層使用了現成的BeanUtil,經過反射來映射,何況Dozer應用了Cache技術,應該比經過BeanUtils映射性能要好點。因此通常的應用應該不存在性能問題。code

2.配置

  1.添加spring相關jar(若是單獨使用能夠不須要配置)

  2.添加dozer與spring集成jar(若是單獨使用dozer,能夠不用dozer-spring,如下全部案例都是與將dozer與spring集成使用)

pom依賴:

 <dependency>
          <groupId>net.sf.dozer</groupId>
          <artifactId>dozer</artifactId>
          <version>5.5.1</version>
      </dependency>

      <dependency>
          <groupId>net.sf.dozer</groupId>
          <artifactId>dozer-spring</artifactId>
          <version>5.5.1</version>
      </dependency>

 spring配置文件:

 <!-- 自動掃描的包名 -->
    <context:annotation-config/>
    <context:component-scan base-package="dozer.*"/>

    <bean id="mapper" class="org.dozer.spring.DozerBeanMapperFactoryBean">
        <property name="mappingFiles" value="classpath*:/*-mapper.xml"/>  //此處的mapper配置文件是用來處理複雜類型的轉換使用
    </bean>

3.案列

  1.基本屬性映射:只會映射屬性名相同的值,若是屬性名不一樣,則不會處理

       只要屬性名相同,基本數據類型之間、String與基本數據類型之間都雙向轉換

    如:int a  <--> double a;   String b <-->float b;

   UserEntity:

public class UserEntity {
    private Long id;
    private String name;
    private int age;
    private String password;
    private Date date;
    private String map;
    ...get()  ...set()
    ...XXX
}

   UserVo:

public class UserVO {
    private Long id;
    private String userName;
    private double age;
    private String password;
    private String createDate;
    private float map;
  ...XXX get() ...set()
}

   測試類:

 @Test
    public void  testDozer(){
        UserEntity entity=new UserEntity(2L,"admin",13,"admin",new Date(),"23.7");
        UserVO userVO=new UserVO();
        mapper.map(entity,userVO);
        System.out.println(userVO);
    }

   結果:

       

   結果對比,若是屬性名不一直,則不會處理

  2.對於1中出現屬性不一致的狀況,咱們仍然想要進行值傳遞,該怎麼辦呢?這時就要用到<property name="mappingFiles" value="classpath*:/*-mapper.xml"/>配置文件

    添加user-mapper.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>-->
        <!--<date-format>yyyy-MM-dd HH:mm:ss</date-format>-->
    <!--</configuration>-->

    <mapping >
        <class-a>entity.UserEntity</class-a>
        <class-b>pojo.UserVO</class-b>
        <field>
            <a>name</a>
            <b>userName</b>
        </field>
        <field>
            <a>date</a>
            <b>createDate</b>
        </field>
    </mapping>
</mappings>

    運行結果:

    

  每一個屬性的值都已傳遞過來,可是注意途中紅框中的內容,Date 類型 轉 String 類型的時候,String createDate的值並非咱們指望的格式,咱們指望將其 裝換成 "yyyy-MM-dd HH:mm:ss"格式,或者其餘自定義的日期格式,那該怎麼辦呢? 請看下一點

  3.對於2中的問題,String  to Date 或 Date  to String 轉換 這裏有三種方式能夠解決:

    ①在屬性匹配 上修改配置 使用dozermapper中field的date-format屬性

  <mapping >
        <class-a>entity.UserEntity</class-a>
        <class-b>pojo.UserVO</class-b>
        <field>
            <a>name</a>
            <b>userName</b>
        </field>
        <field>
            <a date-format="yyyy-MM-dd HH:mm:ss">date</a>
            <b>createDate</b>
        </field>
    </mapping>

    ②在類匹配 上修改配置,使用mapping中的date-format屬性

    <mapping date-format="yyyy-MM-dd HH:mm:ss">
        <class-a>entity.UserEntity</class-a>
        <class-b>pojo.UserVO</class-b>
        <field>
            <a>name</a>
            <b>userName</b>
        </field>
        <field>
            <a>date</a>
            <b>createDate</b>
        </field>
    </mapping>

    ③在全局屬性上 ,修改配置,使用configuration標籤下的date-format標籤 

<?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>
        <date-format>yyyy-MM-dd HH:mm:ss</date-format>
    </configuration>

    <mapping>
        <class-a>entity.UserEntity</class-a>
        <class-b>pojo.UserVO</class-b>
        <field>
            <a>name</a>
            <b>userName</b>
        </field>
        <field>
            <a>date</a>
            <b>createDate</b>
        </field>
    </mapping>
</mappings>

    結果:

  

   4.若是在兩個對象間傳值,不想要對某個屬性賦值,可使用 field-exclude標籤

<mapping>
        <class-a>entity.UserEntity</class-a>
        <class-b>pojo.UserVO</class-b>
        <field>
            <a>name</a>
            <b>userName</b>
        </field>
        <field>
            <a>date</a>
            <b>createDate</b>
        </field>
        <field-exclude>
            <a>unpass</a>
            <b>unpass</b>
        </field-exclude>
    </mapping>

       

  5.級聯映射  UserEntity中有個Colleage對象,而UserVO中有個屬性schoolName指向UserEntity.Colleage.Name

     <field>
            <a>colleage.name</a>
            <b>schoolName</b>
        </field>

 至此,dozer最基本"搬運"方法已經介紹完畢,後續會繼續學習 其餘標籤的用法 以及 集合類型的屬性匹配。

相關文章
相關標籤/搜索