上次大概介绍了为什么要使用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>
在后续的内容中,我们讨论如何得到映射统计数据。