- 浏览: 942985 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
hw7777777:
非常感谢作者提供这么好的工具,在使用的过程中遇到一些问题?1、 ...
基于java nio的memcached客户端——xmemcached -
SINCE1978:
多久过去了时间能抹平一切
无路用的人 -
fangruanyjq:
[img][/img]引用
用osworkflow写一个请假例子(提供代码下载) -
thinkingmysky:
楼主,你确定,java memached client能处理并 ...
memcached java client性能测试的几点疑问和说明 -
hellostory:
aaa5131421 写道07年2月hibernate已经出来 ...
dozer与BeanUtils
呵呵,在《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。
评论
数据库设计并不是暴漏给用户,只是界面而已。如果有远程调用,确实会暴漏给客户,可是暴漏了又有什么问题吗?其实归根暴漏的是业务逻辑,数据库只是你的实现方式恰好和领域模型一致罢了。一个不想给客户看业务逻辑的接口,你想让客户怎么去调用呢
如果User表有一个字段是isAdmin,然后对应类User也有一个属性是isAdmin,莫非也放在界面的隐藏域?你真是XXXX!
数据库设计并不是暴漏给用户,只是界面而已。如果有远程调用,确实会暴漏给客户,可是暴漏了又有什么问题吗?其实归根暴漏的是业务逻辑,数据库只是你的实现方式恰好和领域模型一致罢了。一个不想给客户看业务逻辑的接口,你想让客户怎么去调用呢
发表评论
-
memcached分布测试报告(一致性哈希情况下的散列函数选择)
2009-03-10 16:30 8580一、背景资料 memcached本身是集中式的缓存系统 ... -
xmemcached 0.60 优化过程
2009-03-06 14:37 3559充分利用jprofile等 ... -
Xmemcached vs Spymemcached 3th(linux下测试结果和多节点下表现)
2009-03-07 10:43 4916翠花,上图,首先是容器类和自定义对象的get、set在不同并发 ... -
xmemcached发布1.0-BETA版
2009-03-09 15:32 4168xmemcached 发布1.0-beta ,从0.6 ... -
山寨nio框架yanf4j发布0.50-alpha
2009-02-04 19:28 4244俺的山寨nio框架yanf4j发布0.50-alpha版本,下 ... -
yanf4j引入了客户端非阻塞API
2009-02-19 00:15 3169yanf4j 发布一个0.50-beta2 版本,这个版本最 ... -
基于java nio的memcached客户端——xmemcached
2009-03-03 16:31 75211、xmemcached是什么? xmemcached是基于 ... -
使用yanf4j写个简单聊天室
2008-11-26 11:36 5409yanf4j 简介,请看这里 ... -
Java字符串的最大长度
2009-01-15 01:37 7597在cpp中为了可移植性,s ... -
yanf4j-0.41 beta发布
2009-01-20 14:01 1888项目名称:yanf4j (yet another nio fr ... -
再谈Selector的wakeup方法
2009-02-01 11:15 3065过去推荐过两篇blog《Java NIO类库Selector机 ... -
Yet another nio framework for java
2008-10-11 14:25 2073项目名称:Yanf4j(Yet another nio fra ... -
阻塞队列的性能对比
2008-09-08 10:06 5755阻塞队列的性能对 ... -
java package的设计原则
2008-09-06 00:15 2121典型的J2EE项目,package的设计有成熟的套路可 ... -
线程池池
2008-09-01 19:39 2002这个题目比较怪,听俺道来。俺一直在负责公司游戏服 ... -
第一个MapReduce任务
2008-08-23 11:10 2788前两天在公司内网上搭了个2个节点hadoop集群, ... -
从HDFS看分布式文件系统的设计需求
2008-08-15 22:39 8125分布式文件系统的 ... -
HDFS用户指南(翻译)
2008-08-14 20:27 2146HDFS用户指南 原文地址:http:/ ... -
Ehcache配置的overflowToDisk属性
2008-08-06 23:18 10845Ehcache的overflowToDisk属性用来配 ... -
工作的几个tip
2008-07-07 20:47 28931、如果用java6的ScriptEngineManager ...
相关推荐
**描述详解:** "类似struts一的beanutils的拷贝功能,不过更强大些" —— 这句话指出Dozer与Apache Struts的BeanUtils组件有相似性,它们都提供了对象属性之间的复制功能。但是,Dozer在BeanUtils的基础上进行了...
与Apache的BeanUtils相比,Dozer提供了更高级别的抽象,灵活性更高,并且能够更好地处理复杂的数据类型映射。在实际开发中,尤其是在涉及到数据模型转换时,Dozer是一个非常实用的工具。 **集成Spring** Dozer可以...
为了处理这种情况,Apache Commons提供了另一个类似的包——`Dozer`,它提供了更智能的类型转换机制。 另外,BeanUtils-jar包还包含了一些其他有用的工具,如`DescriptorUtils`和`IntrospectorUtils`,它们可以帮助...
5. **集合操作**: BeanUtils还支持与集合对象(如List、Set和Map)的交互,提供了将集合转换为数组或反之亦然的功能,以及将集合元素映射到JavaBean的属性上。 6. **版本历史**: - **1.0**: 初始版本,引入基本的...
与BeanUtils相比,Dozer不仅支持简单的属性映射,还能够处理复杂的对象类型映射,如集合、自定义对象以及嵌套对象的映射。此外,Dozer提供了更多的定制化选项,允许开发者根据项目需求自定义映射规则,从而提高代码...
Dozer是一个强大的Java对象映射框架,它的核心功能是将一个对象的属性值复制到另一个对象的相应属性上,这在处理对象持久化、服务接口转换、数据展示层与业务逻辑层之间转换等方面非常有用。其主要特性包括: 1. **...
五、BeanUtils与其他工具的比较 虽然BeanUtils提供了方便的功能,但在大量属性复制或性能敏感的场景下,可以考虑使用Dozer、ModelMapper等更高级的映射库,它们提供了更丰富的映射规则和更好的性能。 总结,...
在Java后端开发中,尤其是在与数据库交互时,BeanUtils扮演了重要的角色。 首先,BeanUtils的核心功能在于属性的复制(copyProperties)。它能够将一个对象的属性值复制到另一个对象中,这对于数据的转换和模型绑定...
它类似于Apache的BeanUtils,但Dozer特别优化了复杂对象的映射,可以将一个对象的字段映射到另一个对象,这在分层架构中尤其有用。在分层架构中,通过封装特定数据对象的变化,而不是将这些对象传播到其他层(例如,...
虽然 Dozer 提供了丰富的功能,但在某些特定场景下,如大规模数据转换,可能需要考虑其他解决方案,如 Apache Commons BeanUtils 或 ModelMapper。此外,随着 Java 社区的发展,一些现代的库如 MapStruct 和 ...
问题在于,BeanUtils在进行属性复制时,会尝试通过反射调用getter和setter方法,如果JavaBean的属性名称与实际getter或setter方法不完全匹配,或者属性类型不兼容,就会导致异常。例如,假设我们有一个属性名为`...
dozer是一种JavaBean的映射工具,类似于Apache的BeanUtils。它可以灵活地处理复杂类型之间的映射。不但可以进行简单的属性映射、复杂的类型映射、双向映射、递归映射等,并且可以通过XML配置文件进行灵活的配置。 ...
dozer是一种JavaBean的映射工具,类似于apache的BeanUtils。但是dozer更强大,它可以灵活的处理复杂类型之间的映射。不但可以进行简单的属性映射、复杂的类型映射、双向映射、递归映射等,并且可以通过XML配置文件...
javabean 实体类与实体类之间的快速转换可以使用 Dozer 工具。Dozer 是一个能把实体和实体之间进行转换的工具。只要建立好映射关系,就像 ORM 的数据库和实体映射一样。使用 Dozer 可以快速实现实体类之间的转换。 ...
- **Apache Commons BeanUtils库**:提供了`BeanUtils.copyProperties()`方法,可以快速实现对象间的属性复制,但不支持自定义复制规则。 - **Dozer库**:允许使用注解来定义复制规则,支持深度复制和类型转换,...
对于XML转换,Jackson有一个名为`JAXB`的模块,可以处理XML与Java对象之间的转换。 3. **JAXB (Java Architecture for XML Binding)** JAXB是Java SE的一部分,用于将Java对象绑定到XML。它支持XML到JavaBean的...
Apache Commons BeanUtils库提供了`BeanUtils.copyProperties()`方法实现Bean到Bean的转换,而Map到Bean的转换可以借助`Dozer`或`ModelMapper`库。这些工具可以帮助我们在数据绑定和对象映射中节省大量工作。 4. **...
- 除了标准库,还有一些第三方库如Apache Commons BeanUtils、Dozer等提供了更便捷的对象映射功能,可以简化XML与JavaBean之间的转换。 在实际开发中,根据项目需求和性能考虑,可以选择合适的方法进行XML与...
dozer-5.3.2.jar dr-rpc-2.1.jar druid-0.2.9.jar extjs-3.4.jar fastjson-1.1.21.jar freemarker-2.3.9.jar gecko-1.1.4.jar geronimo-activation_1.1_spec-1.0.2.jar geronimo-javamail_1.4_spec-1.6.jar geronimo...