Dozer小试

一、简介

       分析多层架构的JEE系统,经常存在JavaBean直接的拷贝,典型的解决方案就是手动拷贝,弊端很明显,代码中充斥大量Set Get方法,真正的业务没埋藏与值的拷贝之中.另一种方案就是使用BeanUtil,但BeanUtil不够很好的灵活性,又时候还不得不手动拷贝。

       Dozer提供了一种非常好的解决方案。

       Dozer 是一个对象转换工具。 Dozer可以在JavaBean到JavaBean之间进行递归数据复制,并且这些JavaBean可以是不同的复杂的类型。 所有的mapping,Dozer将会很直接的将名称相同的fields进行复制,如果field名不同,或者有特别的对应要求,则可以在xml中进行定义。 更多详细请参考dozer官网:http://dozer.sourceforge.net/documentation/about.html 

 

二、下载

       1、http://sourceforge.net/projects/dozer/files/

       2、在maven中,pom文中加入:

 

Xml代码   收藏代码
  1. <dependency>  
  2.     <groupId>net.sf.dozer</groupId>  
  3.     <artifactId>dozer</artifactId>  
  4.     <version>5.4.0</version>  
  5. </dependency>  

 

三、示例

      po Book类

Java代码   收藏代码
  1. package dozer;  
  2.   
  3. import java.util.Date;  
  4.   
  5. /** 
  6.  * @author zhuc 
  7.  * @create 2013-3-28 下午1:57:50 
  8.  */  
  9. public class Book {  
  10.   
  11.     private Integer id;  
  12.   
  13.     private String name;  
  14.   
  15.     private String author;  
  16.   
  17.     private String capacity;  
  18.   
  19.     private Date birthday;  
  20.   
  21.     private String bookTypeName;  
  22.   
  23.     private Integer source;  
  24.   
  25.     /** 
  26.      * @return the name 
  27.      */  
  28.     public String getName() {  
  29.         return name;  
  30.     }  
  31.   
  32.     /** 
  33.      * @return the author 
  34.      */  
  35.     public String getAuthor() {  
  36.         return author;  
  37.     }  
  38.   
  39.     /** 
  40.      * @param name the name to set 
  41.      */  
  42.     public void setName(String name) {  
  43.         this.name = name;  
  44.     }  
  45.   
  46.     /** 
  47.      * @param author the author to set 
  48.      */  
  49.     public void setAuthor(String author) {  
  50.         this.author = author;  
  51.     }  
  52.   
  53.     /** 
  54.      * @return the capacity 
  55.      */  
  56.     public String getCapacity() {  
  57.         return capacity;  
  58.     }  
  59.   
  60.     /** 
  61.      * @param capacity the capacity to set 
  62.      */  
  63.     public void setCapacity(String capacity) {  
  64.         this.capacity = capacity;  
  65.     }  
  66.   
  67.     /** 
  68.      * @return the id 
  69.      */  
  70.     public Integer getId() {  
  71.         return id;  
  72.     }  
  73.   
  74.     /** 
  75.      * @param id the id to set 
  76.      */  
  77.     public void setId(Integer id) {  
  78.         this.id = id;  
  79.     }  
  80.   
  81.     /** 
  82.      * @return the birthday 
  83.      */  
  84.     public Date getBirthday() {  
  85.         return birthday;  
  86.     }  
  87.   
  88.     /** 
  89.      * @param birthday the birthday to set 
  90.      */  
  91.     public void setBirthday(Date birthday) {  
  92.         this.birthday = birthday;  
  93.     }  
  94.   
  95.     /** 
  96.      * @return the bookTypeName 
  97.      */  
  98.     public String getBookTypeName() {  
  99.         return bookTypeName;  
  100.     }  
  101.   
  102.     /** 
  103.      * @param bookTypeName the bookTypeName to set 
  104.      */  
  105.     public void setBookTypeName(String bookTypeName) {  
  106.         this.bookTypeName = bookTypeName;  
  107.     }  
  108.   
  109.     /** 
  110.      * @return the source 
  111.      */  
  112.     public Integer getSource() {  
  113.         return source;  
  114.     }  
  115.   
  116.     /** 
  117.      * @param source the source to set 
  118.      */  
  119.     public void setSource(Integer source) {  
  120.         this.source = source;  
  121.     }  
  122.   
  123.     /* (non-Javadoc) 
  124.      * @see java.lang.Object#toString() 
  125.      */  
  126.     @Override  
  127.     public String toString() {  
  128.         return "Book [id=" + id + ", name=" + name + ", author=" + author + ", capacity=" + capacity + ", birthday="  
  129.                 + birthday + ", bookTypeName=" + bookTypeName + ", source=" + source + "]";  
  130.     }  
  131.   
  132. }  

 

      vo BookVo类

Java代码   收藏代码
  1. package dozer;  
  2.   
  3. /** 
  4.  * @author zhuc 
  5.  * @create 2013-3-28 下午1:58:34 
  6.  */  
  7. public class BookVo {  
  8.   
  9.     private Integer id;  
  10.   
  11.     private String nameVo;  
  12.   
  13.     private String authorVo;  
  14.   
  15.     private Integer capacity;  
  16.   
  17.     private String day;  
  18.   
  19.     private BookType bookType;  
  20.   
  21.     private String source;  
  22.   
  23.     /** 
  24.      * @return the nameVo 
  25.      */  
  26.     public String getNameVo() {  
  27.         return nameVo;  
  28.     }  
  29.   
  30.     /** 
  31.      * @return the authorVo 
  32.      */  
  33.     public String getAuthorVo() {  
  34.         return authorVo;  
  35.     }  
  36.   
  37.     /** 
  38.      * @param nameVo the nameVo to set 
  39.      */  
  40.     public void setNameVo(String nameVo) {  
  41.         this.nameVo = nameVo;  
  42.     }  
  43.   
  44.     /** 
  45.      * @param authorVo the authorVo to set 
  46.      */  
  47.     public void setAuthorVo(String authorVo) {  
  48.         this.authorVo = authorVo;  
  49.     }  
  50.   
  51.     /** 
  52.      * @return the capacity 
  53.      */  
  54.     public Integer getCapacity() {  
  55.         return capacity;  
  56.     }  
  57.   
  58.     /** 
  59.      * @param capacity the capacity to set 
  60.      */  
  61.     public void setCapacity(Integer capacity) {  
  62.         this.capacity = capacity;  
  63.     }  
  64.   
  65.     /** 
  66.      * @return the id 
  67.      */  
  68.     public Integer getId() {  
  69.         return id;  
  70.     }  
  71.   
  72.     /** 
  73.      * @param id the id to set 
  74.      */  
  75.     public void setId(Integer id) {  
  76.         this.id = id;  
  77.     }  
  78.   
  79.     /** 
  80.      * @return the day 
  81.      */  
  82.     public String getDay() {  
  83.         return day;  
  84.     }  
  85.   
  86.     /** 
  87.      * @param day the day to set 
  88.      */  
  89.     public void setDay(String day) {  
  90.         this.day = day;  
  91.     }  
  92.   
  93.     /** 
  94.      * @return the bookType 
  95.      */  
  96.     public BookType getBookType() {  
  97.         return bookType;  
  98.     }  
  99.   
  100.     /** 
  101.      * @param bookType the bookType to set 
  102.      */  
  103.     public void setBookType(BookType bookType) {  
  104.         this.bookType = bookType;  
  105.     }  
  106.   
  107.     /** 
  108.      * @return the source 
  109.      */  
  110.     public String getSource() {  
  111.         return source;  
  112.     }  
  113.   
  114.     /** 
  115.      * @param source the source to set 
  116.      */  
  117.     public void setSource(String source) {  
  118.         this.source = source;  
  119.     }  
  120.   
  121.     /* (non-Javadoc) 
  122.      * @see java.lang.Object#toString() 
  123.      */  
  124.     @Override  
  125.     public String toString() {  
  126.         return "BookVo [id=" + id + ", nameVo=" + nameVo + ", authorVo=" + authorVo + ", capacity=" + capacity  
  127.                 + ", day=" + day + ", bookType=" + bookType + ", source=" + source + "]";  
  128.     }  
  129.   
  130. }  

 

其中vo中包含复杂对象BookType类

 

Java代码   收藏代码
  1. package dozer;  
  2.   
  3. /** 
  4.  * @author zhuc 
  5.  * @create 2013-3-28 下午2:43:16 
  6.  */  
  7. public class BookType {  
  8.   
  9.     private String name;  
  10.   
  11.     private String desc;  
  12.   
  13.     /** 
  14.      * @return the name 
  15.      */  
  16.     public String getName() {  
  17.         return name;  
  18.     }  
  19.   
  20.     /** 
  21.      * @return the desc 
  22.      */  
  23.     public String getDesc() {  
  24.         return desc;  
  25.     }  
  26.   
  27.     /** 
  28.      * @param name the name to set 
  29.      */  
  30.     public void setName(String name) {  
  31.         this.name = name;  
  32.     }  
  33.   
  34.     /** 
  35.      * @param desc the desc to set 
  36.      */  
  37.     public void setDesc(String desc) {  
  38.         this.desc = desc;  
  39.     }  
  40.   
  41.     /* (non-Javadoc) 
  42.      * @see java.lang.Object#toString() 
  43.      */  
  44.     @Override  
  45.     public String toString() {  
  46.         return "BookType [name=" + name + ", desc=" + desc + "]";  
  47.     }  
  48.   
  49. }  

 

这里在复制对象,我们发现有类型不一致、名称不一样或者都不一样的需要自定义映射的字段等,我们需要自定义mapping.xml 映射文件。

 

Xml代码   收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <mappings xmlns="http://dozer.sourceforge.net" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  3.     xsi:schemaLocation="http://dozer.sourceforge.net   
  4.     http://dozer.sourceforge.net/schema/beanmapping.xsd">  
  5.       
  6.     <mapping date-format="yyyy-MM-dd HH:mm:ss">  
  7.         <class-a>dozer.Book</class-a>  
  8.         <class-b>dozer.BookVo</class-b>  
  9.         <field>  
  10.             <a>name</a>  
  11.             <b>nameVo</b>  
  12.         </field>  
  13.         <field>  
  14.             <a>author</a>  
  15.             <b>authorVo</b>  
  16.         </field>  
  17.         <field>  
  18.             <a>birthday</a>  
  19.             <b>day</b>  
  20.         </field>  
  21.         <field>  
  22.             <a>bookTypeName</a>  
  23.             <b>bookType.name</b>  
  24.         </field>  
  25.         <field custom-converter="dozer.MyCustomConverter">  
  26.             <a>source</a>  
  27.             <b>source</b>  
  28.         </field>  
  29.     </mapping>  
  30.       
  31. </mappings>  

 

 

Java代码   收藏代码
  1. package dozer;  
  2.   
  3. import org.dozer.CustomConverter;  
  4.   
  5. /** 
  6.  * 自定义转换类 
  7.  * @author zhuc 
  8.  * @create 2013-3-28 下午2:49:39 
  9.  */  
  10. public class MyCustomConverter implements CustomConverter {  
  11.   
  12.     @Override  
  13.     public Object convert(Object existingDestinationFieldValue, Object sourceFieldValue, Class<?> destinationClass,  
  14.             Class<?> sourceClass) {  
  15.         Object obj = null;  
  16.         if (null != sourceFieldValue) {  
  17.             if (sourceFieldValue instanceof Integer) {  
  18.                 if (((Integer) sourceFieldValue).intValue() == 1900) {  
  19.                     obj = "20世纪";  
  20.                 } else if (((Integer) sourceFieldValue).intValue() == 2000) {  
  21.                     obj = "21世纪";  
  22.                 }  
  23.             } else if (sourceFieldValue instanceof String) {  
  24.                 if ("20世纪".equals(sourceFieldValue)) {  
  25.                     obj = 1900;  
  26.                 } else if ("21世纪".equals(sourceFieldValue)) {  
  27.                     obj = 2000;  
  28.                 }  
  29.             }  
  30.         }  
  31.         return obj;  
  32.     }  
  33.   
  34. }  

 

 

 

到这里,我们来看下真正的代码转换测试类:

 

Java代码   收藏代码
  1. package dozer;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.Date;  
  5. import java.util.List;  
  6.   
  7. import org.dozer.DozerBeanMapper;  
  8.   
  9. /** 
  10.  * @author zhuc 
  11.  * @create 2013-3-28 下午3:15:49 
  12.  */  
  13. public class Test {  
  14.   
  15.     /** 
  16.      * @param args 
  17.      */  
  18.     public static void main(String[] args) {  
  19.         List<String> mappers = new ArrayList<String>();  
  20.         mappers.add("mapper.xml");  
  21.   
  22.         DozerBeanMapper dozer = new DozerBeanMapper();  
  23.         dozer.setMappingFiles(mappers);  
  24.   
  25.         Book book = new Book();  
  26.         book.setId(100); // id  2个JavaBean一致  
  27.         book.setName("明天"); // Book:name(String)  <->  BookVo:nameVo(String)  类型一致,名称不一致  
  28.         book.setAuthor("James"); // Book:author(String)  <->  BookVo:authorVo(String) 类型一致,名称不一致  
  29.         book.setCapacity("123"); // Book:capacity(String)  <->  BookVo:capacity(Integer)  类型不一致,名称一致  
  30.         book.setBirthday(new Date()); // Book:birthday(Date)  <->  BookVo:day(String) 类型名称都不一致,且Date<->String互转  
  31.         book.setBookTypeName("科教类"); // Book:bookTypeName(String)  <->  BookVo:BookType:name(String)  源类的字段映射为目标类的复杂对象的字段。  
  32.         book.setSource(1900); // Book:source(Integer)  <->  BookVo:source(String) 自定义的转换,需要实现dozer的CustomConverter接口  
  33.   
  34.         BookVo vo = new BookVo();  
  35.         dozer.map(book, vo);  
  36.   
  37.         System.out.println(book);  
  38.         System.out.println(vo);  
  39.     }  
  40.   
  41. }  

 

 

输出结果:

Book [id=100, name=明天, author=James, capacity=123, birthday=Thu Mar 28 16:00:20 CST 2013, bookTypeName=科教类, source=1900]
BookVo [id=100, nameVo=明天, authorVo=James, capacity=123, day=2013-03-28 16:00:20, bookType=BookType [name=科教类, desc=null], source=20世纪]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值