新的起点 新的开始

快乐生活 !

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>
      <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>
    在后续的内容中,我们讨论如何得到映射统计数据。

posted on 2009-04-13 22:28 advincenting 阅读(3125) 评论(1)  编辑  收藏

评论

# re: JavaBean之间拷贝利器-Dozer(2) 映射数据类型不一致,级联映射与自定义映射 2009-04-16 13:36 popoer

讨厌xml~~~~  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航:
 

公告

Locations of visitors to this page

导航

<2009年4月>
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789

统计

常用链接

留言簿(13)

随笔分类(71)

随笔档案(179)

文章档案(13)

新闻分类

IT人的英语学习网站

JAVA站点

优秀个人博客链接

官网学习站点

生活工作站点

最新随笔

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜