前言:項目中,常常會遇到各層對象之間相互進行值傳遞的過程,如在數據據持久層有一持久類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最基本"搬運"方法已經介紹完畢,後續會繼續學習 其餘標籤的用法 以及 集合類型的屬性匹配。