Dozer-Mapping入门
一、dozer简介:
Dozer是一个JavaBean映射工具库。
它支持简单的属性映射,复杂类型映射,双向映射,隐式显式的映射,以及递归映射。
它支持三种映射方式:注解、API、XML。
它是开源的,遵从Apache 2.0 协议
二、dozer的简单映射
1.第一个映射
前提:两个数据对象具有相同的属性名称
Mappermapper = new DozerBeanMapper();
DestinationObject destObject = mapper.map(sourceObject,DestinationObject.class);
执行这个Dozer映射以后,新的目标对象的实例将会有源对象属性的值,如果映射的属性的数据类型不相同
,Dozer映射引擎将会自动执行数据类型转换,到此为止,我已经完成了第一个Dozer映射。
2.通过XML文件指示用户映射文件
前提:两个不同类型的数据对象,有不同的属性名称
解决思路:添加一个类映射到你的XML映射文件中,这些映射文件在使用过程中被Dozer映射引擎解析。
Dozer映射引擎是有向的,只需要在xml文件中配置一个方向的映射(源对象类型到目标对象类型OR目标对象类型到源对象类型)
提示:相同名称的属性Dozer会自动完成映射
dozer-mapping.xml文件如下
true
MM/dd/yyyyHH:mm
true
yourpackage.yourSourceClassName
yourpackage.yourDestinationClassName
yourSourceFieldName
yourDestinationFieldName
othercustom class mappings would go here.......
三、Dozer 使用
Dozer映射的实现方法
Mapper mapper = new DozerBeanMapper();
DestinationObject destObject = mapper.map(sourceObject,DestinationObject.class);
or
DestinationObject destObject = newDestinationObject();
mapper.map(sourceObject, destObject);
1、通过xml映射
上面有代码-。-
1.1基本属性映射
1.1.1隐式属性的映射
匹配属性的名称是自动进行的,有相同名称的属性可以不再xml中配置
1.1.2简单映射
两个属性有不同的名称,可以被映射如下
onePrime
1.1.3递归映射(双向)
Dozer支持类级别的递归映射,如果你的映射类中有一些作为属性的复杂的类型定义,Dozer将会在映射文件中
寻找类级别的映射,如果没有找到这些类之间的映射,Dozer将会映射复杂类型中具有同名称的属性的值。
1.2其他类型映射
(日后边用边学)
2、通过注解映射
使用注释的显而易见的原因是为了避免重复字段和方法在你的名字映射代码。注释可以把在映射属性本身从而减少的
数量代码。然而在某些情况下当注释应该避免,甚至无法使用。一些是以下几点:
2.1. 你正在映射文的类,不在你的控制范围内,而在dozer库中;
2.2. 映射是相当复杂,需要很多的配制;
在第一种情况下你可以映射或第三方dto和JAXB生成实体不可能把注释放进去。在第二种情况下有选择的将大量的
多行注释或隔离某些重复的实体名称的映射代码。过多标注bean可能有阅读和理解的困难。
ps:注解支持Dozer是实验性的,并且还不支持技术复杂的映射。然而,在最简单的映射情况下,用注解还是比XmL配制
和API方便
我可以把@Mapping标注放在属性的getter方法或直接放在属性上,如果Dozer发现,这是一个双向的映射,这就意味着,
放一次注解,就可以创建双向的映射,类型映射(例如String-long)将会自动进行,全局 定制的转换也可以被解析,
注释只能工作在转换对象在默认通配的情况下
public class SourceBean {
privateLong id;
privateString name;
@Mapping("binaryData")
privateString data;
@Mapping("pk")
publicLong getId() {
return this.id;
}
public String getName() {
return this.name;
}
}
public class TargetBean {
private String pk;
private String name;
private String binaryData;
public void setPk(String pk) {
this.pk = pk;
}
public void setName(String name) {
this.name = name;
}
}
3、通过api映射
import staticorg.dozer.loader.api.FieldsMappingOptions.*;
import staticorg.dozer.loader.api.TypeMappingOptions.*;
...
BeanMappingBuilder builder = newBeanMappingBuilder() {
protectedvoid configure() {
mapping(Bean.class, Bean.class, TypeMappingOptions.oneWay(),
mapId("A"),
mapNull(true)
).exclude("excluded").fields("src", "dest",
copyByReference(),
collectionStrategy(true,
RelationshipType.NON_CUMULATIVE),
hintA(String.class),
hintB(Integer.class),
FieldsMappingOptions.oneWay(),
useMapId("A"),
customConverterId("id")
).fields("src", "dest",
customConverter("org.dozer.CustomConverter")
);
}
};
构造的builder对象被传到DozerBeanMapper实例中,可以添加多个Builder对象
DozerBeanMappermapper = new DozerBeanMapper();
mapper.addMapping(builder);
最后不要忘记了对FieldsMappingOptions和TypeMappingOptins类的静态引入。