JavaBean之間拷貝利器-Dozer(2) 映射數(shù)據(jù)類型不一致,級(jí)聯(lián)映射與自定義映射
上次大概介紹了為什么要使用Dozer,以及對Dozer一個(gè)簡單介紹。 今天我們來討論如何使用Dozer映射復(fù)雜類型:
1. 數(shù)據(jù)類型不一致。
2. 級(jí)聯(lián)映射。
3. 自定義映射。
在討論之前,我們來說說一個(gè)朋友在上篇留言中提到的一個(gè)問題。估計(jì)大家應(yīng)該都很關(guān)心。這個(gè)問題就是性能問題。Dozer其實(shí)底層使用了現(xiàn)成的BeanUtil,通過反射來映射,況且Dozer應(yīng)用了Cache技術(shù),應(yīng)該比自個(gè)通過BeanUtils映射性能要好點(diǎn)。所以一般的應(yīng)用應(yīng)該不存在性能問題。
Dozer對于基本類型之間轉(zhuǎn)換是不用配置的,比如Sting <------>Integer ,只要屬性名稱相同就Ok了。
而常用的Date與String映射配置如下:
對于屬性名稱不一致,也僅僅需要一個(gè)配置文件,如下:
<mapping>
<class-a>net.blogjava.vincent.pojo.CustomerPo</class-a>
<class-b>net.blogjava.vincent.vo.CustomerVo</class-b>
<field>
<a>type</a>
<b>transferType</b>
</field>
</mapping>
指明 CustomerPo里面的type 對應(yīng)CustomerVo里面的transferType.
而對以級(jí)聯(lián),比如CustomerPo里面的一個(gè)屬性映射為CustomerVo里么一個(gè)對象的屬性,下面的配置就可以了
<mapping>
<class-a>net.blogjava.vincent.pojo.CustomerPo</class-a>
<class-b>net.blogjava.vincent.vo.CustomerVo</class-b>
<field>
<a>type</a>
<b>transferType.type</b>
</field>
</mapping>
上面其實(shí)就是Dozer基本用法,也涵蓋了大多數(shù)應(yīng)用場景,可見基本不需要寫代碼,僅僅一個(gè)配置文件搞定,簡單吧。
而對以更個(gè)性化的映射,就需要寫代碼了, 比如在CustomerPo中的into類型的transferId ,映射CustomerVo String 類型transferType, 如果transferId =1 對應(yīng)transferType=“immediateTranfer” 如果transferId =2 對應(yīng)transferType=“scheduleTransfer” 反之亦然。就要寫一個(gè)Customer的Map了, 如下:
import org.dozer.CustomConverter;

public class CustomerMap implements CustomConverter {

public Object convert(Object destinationFieldValue,
Object sourceFieldValue, Class<?> destinationClass,
Class<?> sourceClass) {
Object returnVale = null;
if(sourceFieldValue!=null){
if(sourceFieldValue instanceof Integer ){
if((Integer)sourceFieldValue == 1){
returnVale ="immediateTranfer";
}
if((Integer)sourceFieldValue == 2){
returnVale ="scheduleTransfer";
}
}
if(sourceFieldValue instanceof String ){
if("immediateTranfer".equals(destinationFieldValue)){
returnVale =1;
}
if("scheduleTransfer".equals(destinationFieldValue)){
returnVale =2;
}
}

}
return returnVale;
}

}
然后在配置文件配置就Ok了 如下:
<mapping>
<class-a>net.blogjava.vincent.pojo.CustomerPo</class-a>
<class-b>net.blogjava.vincent.vo.CustomerVo</class-b>
<field custom-converter="net.blogjava.vincent.mapUtil.CustomerMap">
<a>type</a>
<b>transferType</b>
</field>
</mapping>
下面就是一個(gè)完整的配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<mappings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://dozer.sourceforge.net E:\dozer\dozer-5.0-src\dozer-5.0\src\site\resources\schema\beanmapping.xsd"
xmlns="http://dozer.sourceforge.net">
<mapping date-format="yyyy-MM-dd">
<class-a>net.blogjava.vincent.pojo.UserInfo</class-a>
<class-b>net.blogjava.vincent.vo.UserInfoVo</class-b>
<field>
<a>colleage.name</a>
<b>schoolName</b>
</field>
</mapping>
<mapping>
<class-a>net.blogjava.vincent.pojo.CustomerPo</class-a>
<class-b>net.blogjava.vincent.vo.CustomerVo</class-b>
<field custom-converter="net.blogjava.vincent.mapUtil.CustomerMap">
<a>type</a>
<b>transferType</b>
</field>
</mapping>

</mappings>
在后續(xù)的內(nèi)容中,我們討論如何得到映射統(tǒng)計(jì)數(shù)據(jù)。
1. 數(shù)據(jù)類型不一致。
2. 級(jí)聯(lián)映射。
3. 自定義映射。
在討論之前,我們來說說一個(gè)朋友在上篇留言中提到的一個(gè)問題。估計(jì)大家應(yīng)該都很關(guān)心。這個(gè)問題就是性能問題。Dozer其實(shí)底層使用了現(xiàn)成的BeanUtil,通過反射來映射,況且Dozer應(yīng)用了Cache技術(shù),應(yīng)該比自個(gè)通過BeanUtils映射性能要好點(diǎn)。所以一般的應(yīng)用應(yīng)該不存在性能問題。
Dozer對于基本類型之間轉(zhuǎn)換是不用配置的,比如Sting <------>Integer ,只要屬性名稱相同就Ok了。
而常用的Date與String映射配置如下:
<mapping date-format="MM-dd-yyyy"> <class-a>net.blogjava.vincent.pojo.CustomerPo</class-a> <class-b>net.blogjava.vincent.vo.CustomerVo</class-b> <field> <a>birthday</a> <b>dateOfBirth</b> </field> </mapping> 指明 CustomerPo里面的birthday對應(yīng)CustomerVo里面的dateOfBirth.并且是Date與String之間雙向映射。
對于屬性名稱不一致,也僅僅需要一個(gè)配置文件,如下:
<mapping>
<class-a>net.blogjava.vincent.pojo.CustomerPo</class-a>
<class-b>net.blogjava.vincent.vo.CustomerVo</class-b>
<field>
<a>type</a>
<b>transferType</b>
</field>
</mapping>
指明 CustomerPo里面的type 對應(yīng)CustomerVo里面的transferType.
而對以級(jí)聯(lián),比如CustomerPo里面的一個(gè)屬性映射為CustomerVo里么一個(gè)對象的屬性,下面的配置就可以了
<mapping>
<class-a>net.blogjava.vincent.pojo.CustomerPo</class-a>
<class-b>net.blogjava.vincent.vo.CustomerVo</class-b>
<field>
<a>type</a>
<b>transferType.type</b>
</field>
</mapping>
上面其實(shí)就是Dozer基本用法,也涵蓋了大多數(shù)應(yīng)用場景,可見基本不需要寫代碼,僅僅一個(gè)配置文件搞定,簡單吧。
而對以更個(gè)性化的映射,就需要寫代碼了, 比如在CustomerPo中的into類型的transferId ,映射CustomerVo String 類型transferType, 如果transferId =1 對應(yīng)transferType=“immediateTranfer” 如果transferId =2 對應(yīng)transferType=“scheduleTransfer” 反之亦然。就要寫一個(gè)Customer的Map了, 如下:

































然后在配置文件配置就Ok了 如下:
<mapping>
<class-a>net.blogjava.vincent.pojo.CustomerPo</class-a>
<class-b>net.blogjava.vincent.vo.CustomerVo</class-b>
<field custom-converter="net.blogjava.vincent.mapUtil.CustomerMap">
<a>type</a>
<b>transferType</b>
</field>
</mapping>
下面就是一個(gè)完整的配置文件:























posted on 2009-04-13 22:28 advincenting 閱讀(3138) 評(píng)論(1) 編輯 收藏