上次大概介紹了為什么要使用Dozer,以及對Dozer一個簡單介紹。 今天我們來討論如何使用Dozer映射復雜類型:
1. 數據類型不一致。
2. 級聯映射。
3. 自定義映射。
在討論之前,我們來說說一個朋友在上篇留言中提到的一個問題。估計大家應該都很關心。這個問題就是性能問題。Dozer其實底層使用了現成的BeanUtil,通過反射來映射,況且Dozer應用了Cache技術,應該比自個通過BeanUtils映射性能要好點。所以一般的應用應該不存在性能問題。
Dozer對于基本類型之間轉換是不用配置的,比如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對應CustomerVo里面的dateOfBirth.并且是Date與String之間雙向映射。
對于屬性名稱不一致,也僅僅需要一個配置文件,如下:
<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 對應CustomerVo里面的transferType.
而對以級聯,比如CustomerPo里面的一個屬性映射為CustomerVo里么一個對象的屬性,下面的配置就可以了
<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>
上面其實就是Dozer基本用法,也涵蓋了大多數應用場景,可見基本不需要寫代碼,僅僅一個配置文件搞定,簡單吧。
而對以更個性化的映射,就需要寫代碼了, 比如在CustomerPo中的into類型的transferId ,映射CustomerVo String 類型transferType, 如果transferId =1 對應transferType=“immediateTranfer” 如果transferId =2 對應transferType=“scheduleTransfer” 反之亦然。就要寫一個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>
下面就是一個完整的配置文件:
<?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>

在后續的內容中,我們討論如何得到映射統計數據。