`

dozer与BeanUtils

    博客分类:
  • java
阅读更多

呵呵,在《develope J2EE without EJB》中,DTO被狠很地批判了一把,rod说这完全是反模式。可实际项目当中,我们还是不得不在使用。VO,PO,一牵扯到概念总是多么复杂。。。把一个PO从头传到尾??从页面到数据库,一捅到底?NO,NO,万一你要显示给用户的是几个PO的结合怎么办?万一我们只是需要某几个属性组合在一起显示怎么办?一捅到底的策略是多么丑陋,而且你完全把你的数据库设计模型暴露给用户。所以我们需要一些map工具来转换,在这方面,过去我只知道有个 BeanUtils,不够灵活,而今天,接触了下dozer,啊,跟spring一样的理念!灵活多变,你想怎么映射,想怎么换都可以。看看它支持的转换类型:

• Primitive to Primitive Wrapper
• Primitive to Custom Wrapper
• Primitive Wrapper to Primitive Wrapper

• Primitive to Primitive
• Complex Type to Complex Type
• String to Primitive
• String to Primitive Wrapper
• String to Complex Type if the Complex Type contains a String constructor
• Each of these can be mapped to one another: java.util.Date, java.sql.Date, java.sql.Time,
java.sql.Timestamp, java.util.Calendar, java.util.GregorianCalendar
• String to any of the supported Date/Calendar Objects if an explicit date format mapping attribute is
specified.
• Objects containing a toString() method that produces a long representing time in (ms) to any
supported Date/Calendar object.

几乎我们能想到的,它都提供了方法来做到。而且dozer可以很容易地跟spring集成。下面举个简单例子:

定义一个Book对象:

package com.denny_blue.dozerdemo;
public class Book {
 private String name;
 private String author;
 
 
 public Book(){
  
 } 
 public void setAuthor(String author) {
  this.author = author;
 }

 public String getAuthor() {
  return (this.author);
 }
 public void setName(String name){
  this.name=name;
 } 
 public String getName(){
  return this.name;
 }
}
简单的,我们要实例化一个对象,然后clone此对象,注意,是clone!

package com.denny_blue.dozerdemo;
import net.sf.dozer.util.mapping.DozerBeanMapper;
import java.util.List;
import java.util.ArrayList;


public class MyFirstDozerDemo {
 public static void main(String args[]){
  Book book1=new Book();
  book1.setAuthor("dennis");
  book1.setName("dozer demo");
  DozerBeanMapper mapper=new DozerBeanMapper();
  Book book2=new Book();
  mapper.map(book1,book2);
  book2=(Book)mapper.map(book1,com.denny_blue.dozerdemo.Book.class);
  System.out.println("book2's name:"+book2.getName());
     }

OK,如此简单,我们把book1的属性完全复制给了book2,两者现在是完全独立的对象。可如果仅仅是这样,我们用BeanUtils不是也很容易办到? book2=(Book)BeanUtils.cloneBean(book1);可如果我要把book1映射给一个完全不同的类的对象怎么办?而且他们的属性名也不相同,怎么办?比如,一个CookBook类:

package com.denny_blue.dozerdemo;
public class CookBook {
 private String bookName;
 private String author;


 public CookBook(){}
 public String getBookName() {
  return (this.bookName);
 }

 public void setBookName(String bookName) {
  this.bookName = bookName;
 }

 public String getAuthor() {
  return (this.author);
 }

 public void setAuthor(String author) {
  this.author = author;
 }


}
它的bookName属性与Book的name属性名不一样,我们该如何复制?dozer通过xml文件的配置来灵活地达到这个目的。我们配置一个dozerBeanMapping.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mappings PUBLIC "-//DOZER//DTD MAPPINGS//EN"
"http://dozer.sourceforge.net/dtd/dozerbeanmapping.dtd">
<mappings>
<configuration>
<stop-on-errors>false</stop-on-errors>
<date-format>MM/dd/yyyy HH:mm</date-format>
<wildcard>true</wildcard>
</configuration>
<mapping>
<class-a>com.denny_blue.dozerdemo.Book</class-a>
<class-b>com.denny_blue.dozerdemo.CookBook</class-b>
<field>
<a>name</a>
<b>bookName</b>
</field>
<field>
<a>author</a>
<b>author</b>
</field>
</mapping>
</mappings>

如上所示,<class-a>指定所要复制的源对象,<class-b>复制的目标对象,<a>源对象的属性名, <b>目标对象的属性名。wildcard默认为true,在此时默认对所有属性进行map,如果为false,则只对在xml文件中配置的属性进行map。此时的demo 看起来像这样:

package com.denny_blue.dozerdemo;
import net.sf.dozer.util.mapping.DozerBeanMapper;
import java.util.List;
import java.util.ArrayList;


public class MyFirstDozerDemo {
 public static void main(String args[]){
  Book book1=new Book();
  book1.setAuthor("dennis");
  book1.setName("dozer demo");
  DozerBeanMapper mapper=new DozerBeanMapper();
  book2=(Book)mapper.map(book1,com.denny_blue.dozerdemo.Book.class);
  CookBook cookBook=new CookBook();
  List myMappingFiles = new ArrayList();
  myMappingFiles.add("dozerBeanMapping.xml");
  mapper.setMappingFiles(myMappingFiles);
  cookBook=(CookBook)mapper.map(book1,CookBook.class);
  System.out.println("cookBook's name:"+   cookBook.getBookName()+"     cookBook's author:"+
                      cookBook.getAuthor());
 }
}

通过mapper.setMappingFiles()设置映射文件,可以添加多个配置文件,也可以把所有的映射写在一个配置文件里面。  更多复杂例子请见它自带的doc。

分享到:
评论
3 楼 hellostory 2013-11-15  
aaa5131421 写道
07年2月hibernate已经出来好久了吧,配置上关联,组合的对象一定是关联在一起的。
数据库设计并不是暴漏给用户,只是界面而已。如果有远程调用,确实会暴漏给客户,可是暴漏了又有什么问题吗?其实归根暴漏的是业务逻辑,数据库只是你的实现方式恰好和领域模型一致罢了。一个不想给客户看业务逻辑的接口,你想让客户怎么去调用呢


如果User表有一个字段是isAdmin,然后对应类User也有一个属性是isAdmin,莫非也放在界面的隐藏域?你真是XXXX!
2 楼 aaa5131421 2010-09-10  
07年2月hibernate已经出来好久了吧,配置上关联,组合的对象一定是关联在一起的。
数据库设计并不是暴漏给用户,只是界面而已。如果有远程调用,确实会暴漏给客户,可是暴漏了又有什么问题吗?其实归根暴漏的是业务逻辑,数据库只是你的实现方式恰好和领域模型一致罢了。一个不想给客户看业务逻辑的接口,你想让客户怎么去调用呢
1 楼 amang 2007-04-28  
请问一下,dozer 的哪个版本是支持JDK1.4?

相关推荐

    dozer的使用实例

    内含dozer的完整实例,以及jar包。dozer比BeanUtils更灵活,同时可以很容易地跟spring集成。也可以用注解@Mapping("asstManagerId")来代替xml配置

    dozer-user-guide

    dozer是一种JavaBean的映射工具,类似于apache的BeanUtils

    dozer-5.5.1-API文档-中英对照版.zip

    赠送jar包:dozer-5.5.1.jar; 赠送原API文档:dozer-5.5.1-javadoc.jar; 赠送源代码:dozer-5.5.1-sources.jar; 赠送Maven依赖信息文件:dozer-5.5.1.pom; 包含翻译后的API文档:dozer-5.5.1-javadoc-API文档-...

    dozer-5.3.2-src.zip

    dozer是一种JavaBean的映射工具,类似于apache的BeanUtils。但是dozer更强大,它可以灵活的处理复杂类型之间的映射

    dozer5.2 jar包

    下载内容包含 commons-beanutils-1.7.0.jar commons-collections.jar commons-lang-2.5.jar dozer-5.2.0.jar等

    dozer-5.5.1.jar

    dozer-5.5.1.jar dozer-5.5.1.jar dozer-5.5.1.jar dozer-5.5.1.jar

    springboot-dozer

    dozer是一种JavaBean的映射工具,类似于Apache的BeanUtils。它可以灵活地处理复杂类型之间的映射。不但可以进行简单的属性映射、复杂的类型映射、双向映射、递归映射等,并且可以通过XML配置文件进行灵活的配置。 ...

    dozer的eclipse插件

    dozer的eclipse插件,使用该插件可以可视化编辑对应属性,简化你的编码工作

    org.dozer JAR 包(实现java bean mapper)

    dozer是一款优秀的java bean映射开源框架,完成深度转换Bean&lt;-&gt;Bean的Mapper实现

    dozer复杂类型测试类.zip

    dozer 的配置Mapping,包含普通映射配置,List复杂类型配置。ReqParam.json 是转换类的参数值,StringUtils 读取文件。

    dozer小例子-bean复制

    需要lib[dozer-5.0.jar, commons-lang.jar],有需要的请猛击下载

    javaEE的对象拷贝工具dozer

    该文件是拷贝对象工具dozer相关的jar包和dozer的配置用法的详细说明,简洁实用。

    dozer(PDF)

    有关于dozer的用法  毕业了~ 所有资料拿出来分享~ 难免有错误~多见谅~

    dozer5.5.1 ( 可集成spring 及 OSGi )

    dozer5.5.1 ( 可集成spring 及 OSGi ) , 不论在spring及osgi 下均可使用 包含所有5.5.1 所依赖的jar包,可根据需求添加。

    dozer-5.5.1-API文档-中文版.zip

    赠送jar包:dozer-5.5.1.jar; 赠送原API文档:dozer-5.5.1-javadoc.jar; 赠送源代码:dozer-5.5.1-sources.jar; 赠送Maven依赖信息文件:dozer-5.5.1.pom; 包含翻译后的API文档:dozer-5.5.1-javadoc-API文档-...

    dozer 3.0.2

    好用简洁的开源mac osx下的菜单栏管理软件,完美替代Bartender

    复制bean的开源工具Dozer

    NULL 博文链接:https://gaojiewyh.iteye.com/blog/1528587

    Dozer 使用

    NULL 博文链接:https://bruceliu02.iteye.com/blog/1771227

    dozer 架包!!!!!!!!!!

    类似struts一的beanutils的拷贝值的功能,不过更强大些。

Global site tag (gtag.js) - Google Analytics