dozer是一个对象转换工具。Dozer可以在JavaBean与JavaBeanz之间进行递归数据复制,并且这些JavaBean可以是不同的复杂的类型。所有mapping,dozer将会很直接的将名称相同的fields进行复制,如果fields进行复制,如果field名不同,或者有特别的对应要求,则可以在xml中进行定义。
二、为什么使用dozer
分析多层架构的J2EE系统,经常存在JavaBean直接的拷贝。比如我们在DAO层,通过DO取得业务层需要的数据,将这些数据传递给Service层的VO。DO与VO就存在典型的值拷贝。典型的解决方案就是手动拷贝,弊端很明显,代码中充斥大量Set和Get方法,真正的业务被埋藏值与值的拷贝之中。另一种方案就是使用BeanUtil,但是BeanUtil不够很好的灵活性,有时候还不得不手动拷贝。Dozer可以灵活的对对象进行转换,且使用简单。
三、与Spring继承
- pom依赖
<dependency>
<groupId>net.sf.dozer</groupId>
<artifactId>dozer</artifactId>
<version>5.5.1</version>
</dependency>
<dependency>
<groupId>net.sf.dozer</groupId>
<artifactId>dozer-spring</artifactId>
<version>5.5.1</version>
</dependency>
- Spring配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"
default-autowire="byName" default-lazy-init="false">
<bean id="beanMapper" class="org.dozer.spring.DozerBeanMapperFactoryBean">
<property name="mappingFiles">
<list>
<value>classpath:dozer/*.xml</value>
</list>
</property>
</bean>
</beans>
- 编写BeanMapperService
public class BeanMapperService {
@Autowired
private Mapper beanMapper;
//基于Dozer转换对象的类型.
public <T> T mapper(Object source, Class<T> destinationClass) {
return beanMapper.map(source, destinationClass);
}
//基于Dozer转换Collection中对象的类型.
public <T> List<T> mapperList(Collection sourceList, Class<T> destinationClass) {
List<T> destinationList = new ArrayList<>();
for (Object sourceObject : sourceList) {
T destinationObject = beanMapper.map(sourceObject, destinationClass);
destinationList.add(destinationObject);
}
return destinationList;
}
//基于Dozer将对象A的值拷贝到对象B中.
public void copy(Object source, Object destinationObject) {
beanMapper.map(source, destinationObject);
}
}
- 对象转换
第一种:该方式用于数据类型为基本类型,名称相同的对象映射。
第二种:改方式用于数据类型不一致,或者名称不相同或者有级联关系等情况下的映射,该方式可以添加多个配置文件。
第三种:改方式用于数据类型不一致,或者名称不相同或者有级联关系等情况下的映射,配置文件只有一个映射文件叫dozerBeanMapping.xml且在根目录下。
1.基本属性映射:只会映射属性名相同的值,如果属性名不同,则不会处理。如果我们仍要进行值传递,可以使用xml配置。
<?xml version="1.0" encoding="UTF-8"?>
<mappings xmlns="http://dozer.sourceforge.net"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://dozer.sourceforge.net
http://dozer.sourceforge.net/schema/beanmapping.xsd">
<!--<configuration>-->
<!--<date-format>yyyy-MM-dd HH:mm:ss</date-format>-->
<!--</configuration>-->
<mapping >
<class-a>entity.UserEntity</class-a>
<class-b>pojo.UserVO</class-b>
<field>
<a>name</a>
<b>userName</b>
</field>
<field>
<a>date</a>
<b>createDate</b>
</field>
</mapping>
</mappings>
String to Date 或 Date to String 转换 这里有三种方式可以解决:
在属性匹配 上修改配置 使用dozermapper中field的date-format属性
<mapping >
<class-a>entity.UserEntity</class-a>
<class-b>pojo.UserVO</class-b>
<field>
<a>name</a>
<b>userName</b>
</field>
<field>
<a date-format="yyyy-MM-dd HH:mm:ss">date</a>
<b>createDate</b>
</field>
</mapping>
在类匹配 上修改配置,使用mapping中的date-format属性
<mapping date-format="yyyy-MM-dd HH:mm:ss">
<class-a>entity.UserEntity</class-a>
<class-b>pojo.UserVO</class-b>
<field>
<a>name</a>
<b>userName</b>
</field>
<field>
<a>date</a>
<b>createDate</b>
</field>
</mapping>
在全局属性上 ,修改配置,使用configuration标签下的date-format标签
<?xml version="1.0" encoding="UTF-8"?>
<mappings xmlns="http://dozer.sourceforge.net"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://dozer.sourceforge.net
http://dozer.sourceforge.net/schema/beanmapping.xsd">
<configuration>
<date-format>yyyy-MM-dd HH:mm:ss</date-format>
</configuration>
<mapping>
<class-a>entity.UserEntity</class-a>
<class-b>pojo.UserVO</class-b>
<field>
<a>name</a>
<b>userName</b>
</field>
<field>
<a>date</a>
<b>createDate</b>
</field>
</mapping>
</mappings>
如果在两个对象间传值,不想要对某个属性赋值,可以使用 field-exclude标签
<mapping>
<class-a>entity.UserEntity</class-a>
<class-b>pojo.UserVO</class-b>
<field>
<a>name</a>
<b>userName</b>
</field>
<field>
<a>date</a>
<b>createDate</b>
</field>
<field-exclude>
<a>unpass</a>
<b>unpass</b>
</field-exclude>
</mapping>
级联映射 UserEntity中有个Colleage对象,而UserVO中有个属性schoolName指向UserEntity.Colleage.Name
<field>
<a>colleage.name</a>
<b>schoolName</b>
</field>
四、实际项目中经验:
1、为了不使用映射xml配置文件,vo、bo、dto、po等说有的字段名统一的一样
2、字段的类型统一的一致,使用包装类型
参考:
http://blog.csdn.net/u011679955/article/details/52929297