JavaBean之间拷贝利器-Dozer 映射数据类型不一致,级联映射与自定义映射。
上次大概介绍了为什么要使用Dozer,以及对Dozer一个简单介绍。 今天我们来讨论如何使用Dozer映射复杂类型:
1. 数据类型不一致。
2. 级联映射。
3. 自定义映射。
在讨论之前,我们来说说一个朋友在上篇留言中提到的一个问题。估计大家应该都很关心。这个问题就是性能问题。Dozer其实底层使用了现成的BeanUtil,通过反射来映射,况且Dozer应用了Cache技术,应该比自个通过BeanUtils映射性能要好点。所以一般的应用应该不存在性能问题。
Dozer对于基本类型之间转换是不用配置的,比如Sting ------Integer ,只要属性名称相同就Ok了。
而常用的Date与String映射配置如下:
mapping date-format="MM-dd-yyyy"
class-anet.blogjava.vincent.pojo.CustomerPo/class-a
class-bnet.blogjava.vincent.vo.CustomerVo/class-b
field
abirthday/a
bdateOfBirth/b
/field
/mapping
指明 CustomerPo里面的birthday对应CustomerVo里面的dateOfBirth.并且是Date与String之间双向映射。
对于属性名称不一致,也仅仅需要一个配置文件,如下:
mapping
class-anet.blogjava.vincent.pojo.CustomerPo/class-a
class-bnet.blogjava.vincent.vo.CustomerVo/class-b
field
atype/a
btransferType/b
/field
/mapping
指明 CustomerPo里面的type 对应CustomerVo里面的transferType.
而对以级联,比如CustomerPo里面的一个属性映射为CustomerVo里么一个对象的属性,下面的配置就可以了
mapping
class-anet.blogjava.vincent.pojo.CustomerPo/class-a
class-bnet.blogjava.vincent.vo.CustomerVo/class-b
field
atype/a
btransferType.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
ifsourceFieldValue == 2)
}
if
if)
}
}
return returnVale;
}
}
然后在配置文件配置就Ok了 如下:
mapping
class-anet.blogjava.vincent.pojo.CustomerPo/class-a
class-bnet.blogjava.vincent.vo.CustomerVo/class-b
field custom-converter="net.blogjava.vincent.mapUtil.CustomerMap"
atype/a
btransferType/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:dozerdozer-5.0-srcdozer-5.0srcsiteresourcesschemabeanmapping.xsd"
xmlns="http://dozer.sourceforge.net"
mapping date-format="yyyy-MM-dd"
class-anet.blogjava.vincent.pojo.UserInfo/class-a
class-bnet.blogjava.vincent.vo.UserInfoVo/class-b
field
acolleage.name/a
bschoolName/b
/field
/mapping
mapping
class-anet.blogjava.vincent.pojo.CustomerPo/class-a
class-bnet.blogjava.vincent.vo.CustomerVo/class-b
field custom-converter="net.blogjava.vincent.mapUtil.CustomerMap"
atype/a
btransferType/b
/field
/mapping
/mappings
在后续的内容中,我们讨论如何得到映射统计数据。