JavaBean之间拷贝利器-Dozer(2) 映射数据类型不一致,级联映射与自定义映射。
上次大概介绍了为什么要使用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> |
指明 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; |
然后在配置文件配置就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:dozerdozer-5.0-srcdozer-5.0srcsiteresourcesschemabeanmapping.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> |
在后续的内容中,我们讨论如何得到映射统计数据。