参考文档:
DOZER开发手册总结
http://blog.csdn.net/whhahyy/article/details/48594657
使用Dozer优雅的将DO转换成VO
http://www.hollischuang.com/archives/1613
Dozer 使用总结,也许对你有帮助
http://vincent1003.iteye.com/blog/762494
文章内容主要分为以下两个部分:
1.领域模型命名规约.
2.为什么使用dozer 完成领域模型对象之间的转换
3.dozer 使用示例
一.领域模型命名规约
领域模型命名规约:
DO(Data Object):与数据库表结构一一对应,通过DAO层向上传输数据源对象。
DTO(Data Transfer Object):数据传输对象,Service或Manager向外传输的对象。
BO(Business Object):业务对象。由Service层输出的封装业务逻辑的对象。
AO(Application Object):应用对象。在Web层与Service层之间抽象的复用对象模型,极为贴近展示层,复用度不高。
VO(View Object):显示层对象,通常是Web向模板渲染引擎层传输的对象。
Query:数据查询对象,各层接收上层的查询请求。注意超过2个参数的查询封装,禁止使用Map类来传输。
二.为什么使用dozer 完成领域模型对象之间的转换
1.1 什么是dozer?
Dozer 是一个对象转换工具。Dozer可以在JavaBean到JavaBean之间进行递归数据复制,并且这些JavaBean可以是不同的复杂的类型。
所有的mapping,Dozer将会很直接的将名称相同的fields进行复制,如果field名不同,或者有特别的对应要求,则可以在xml中进行定义。
更多详细请参考dozer官网:http://dozer.sourceforge.net/documentation/about.html
1.2 为什么要使用Dozer?
分析多层架构的J2EE系统,经常存在JavaBean直接的拷贝。比如我们在DAO层,通过Do取得业务层需要的数据,将这些数据传递给 Service层的VO。
DO与VO就存在典型的值拷贝。
典型的解决方案就是手动拷贝,弊端很明显,代码中充斥大量Set 和Get方法,真正的业务被埋藏值与值的拷贝之中。
另一种方案就是使用BeanUtil,但BeanUtil不够很好的灵活性,又时候还不得不手动拷贝。
Dozer可以灵活的对对象进行转换,且使用简单。
Dozer 的主要功能
三. 常用的例子展示
1.相同属性名 的JavaBean之间转换
2.不同属性名 的JavaBean之间转换
3.复杂结构/嵌套类型 的JavaBean之间转换
1.相同属性名的JavaBean之间转换
VO
package com.ybl.test.dozer.bean;
import java.io.*;
/**
* Created by szh on 2017/12/1.
*/
public class SameVO implements Serializable {
private Integer id;
private String name;
private String tel;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
@Override
public String toString() {
return "SameVO{" +
"id=" + id +
", name='" + name + '\'' +
", tel='" + tel + '\'' +
'}';
}
@Override
public Object clone()
{
try{
//将对象写入流内
ByteArrayOutputStream bo = new ByteArrayOutputStream();
ObjectOutputStream oo = new ObjectOutputStream(bo);
oo.writeObject(this);
//将对象从流内读出来
ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray());
ObjectInputStream oi = new ObjectInputStream(bi);
return (oi.readObject());
}catch (Exception e){
e.printStackTrace();
}
return null;
}
}
DTO
package com.ybl.test.dozer.bean;
import java.io.*;
/**
* Created by szh on 2017/12/1.
*/
public class SameDTO implements Serializable{
private Integer id;
private String name;
private String tel;
private String address;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "SameDTO{" +
"id=" + id +
", name='" + name + '\'' +
", tel='" + tel + '\'' +
", address='" + address + '\'' +
'}';
}
@Override
public Object clone()
{
try{
//将对象写入流内
ByteArrayOutputStream bo = new ByteArrayOutputStream();
ObjectOutputStream oo = new ObjectOutputStream(bo);
oo.writeObject(this);
//将对象从流内读出来
ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray());
ObjectInputStream oi = new ObjectInputStream(bi);
return (oi.readObject());
}catch (Exception e){
e.printStackTrace();
}
return null;
}
}
转换测试
package com.ybl.test.dozer;
import com.ybl.test.dozer.bean.*;
import org.dozer.DozerBeanMapper;
import org.dozer.Mapper;
/**
* Created by szh on 2017/12/1.
*/
public class ConvertSameProperties {
public static void main(String[] args){
Mapper mapper = new DozerBeanMapper();
SameDTO src = new SameDTO();
src.setId(1);
src.setName("szh");
src.setAddress("heaven");
src.setTel("0000-0000-00000");
System.out.println("DTO to VO");
SameVO destObject = mapper.map(src, SameVO.class);
System.out.println(destObject);
System.out.println("VO to DTO");
SameVO copyVO = (SameVO) destObject.clone();
SameDTO toDTOObject = mapper.map(copyVO , SameDTO.class);
System.out.println(toDTOObject);
}
}
2.不同属性名的JavaBean之间转换 (利用注解完成属性名之间的匹配)
VO
package com.ybl.test.dozer.bean;
import org.dozer.Mapping;
/**
* Created by szh on 2017/12/1.
*/
public class DiffVO {
private Integer id;
@Mapping("name")
private String username;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
@Override
public String toString() {
return "DiffVO{" +
"id=" + id +
", username='" + username + '\'' +
'}';
}
}
DTO
package com.ybl.test.dozer.bean;
import org.dozer.Mapping;
/**
* Created by szh on 2017/12/1.
*/
public class DiffDTO {
private Integer id;
@Mapping("username")
private String name;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "DiffDTO{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
转换测试
package com.ybl.test.dozer;
import com.ybl.test.dozer.bean.*;
import org.dozer.DozerBeanMapper;
import org.dozer.Mapper;
/**
* Created by szh on 2017/12/1.
*/
public class ConvertDiffProperties {
public static void main(String[] args){
Mapper mapper = new DozerBeanMapper();
DiffDTO srcDTO = new DiffDTO();
srcDTO.setId(1);
srcDTO.setName("szh");
System.out.println("DTO to VO");
DiffVO destVO = mapper.map(srcDTO, DiffVO.class);
System.out.println(destVO);
DiffVO srcVO = new DiffVO();
srcVO.setId(1);
srcVO.setUsername("szh");
System.out.println("VO to DTO");
DiffDTO destDTO = mapper.map(srcVO, DiffDTO.class);
System.out.println(destDTO);
}
}
3.复杂结构/嵌套类型 的JavaBean之间转换
RebateRuleVO 中嵌套 RebateVO
RebateDTO 中嵌套 RebateDTO
RebateRuleVO
package com.ybl.test.dozer.bean;
import java.util.List;
/**
* Created by szh on 2017/12/1.
*/
public class RebateRuleVO {
private Integer rebateRuleId;
private String rebateRuleName;
private List<RebateVO> rebateVOList;
public Integer getRebateRuleId() {
return rebateRuleId;
}
public void setRebateRuleId(Integer rebateRuleId) {
this.rebateRuleId = rebateRuleId;
}
public String getRebateRuleName() {
return rebateRuleName;
}
public void setRebateRuleName(String rebateRuleName) {
this.rebateRuleName = rebateRuleName;
}
public List<RebateVO> getRebateVOList() {
return rebateVOList;
}
public void setRebateVOList(List<RebateVO> rebateVOList) {
this.rebateVOList = rebateVOList;
}
}
RebateVO
package com.ybl.test.dozer.bean;
/**
* Created by szh on 2017/12/1.
*/
public class RebateVO {
private Integer rebateId;
private Double fixed;
private Double upper;
private Double floor;
public Integer getRebateId() {
return rebateId;
}
public void setRebateId(Integer rebateId) {
this.rebateId = rebateId;
}
public Double getFixed() {
return fixed;
}
public void setFixed(Double fixed) {
this.fixed = fixed;
}
public Double getUpper() {
return upper;
}
public void setUpper(Double upper) {
this.upper = upper;
}
public Double getFloor() {
return floor;
}
public void setFloor(Double floor) {
this.floor = floor;
}
@Override
public String toString() {
return "RebateVO{" +
"rebateId=" + rebateId +
", fixed=" + fixed +
", upper=" + upper +
", floor=" + floor +
'}';
}
}
=================
RebateRuleDTO
package com.ybl.test.dozer.bean;
import org.dozer.Mapping;
import java.util.List;
/**
* Created by szh on 2017/12/1.
*/
public class RebateRuleDTO {
private Integer rebateRuleId;
private String rebateRuleName;
private String rebateRuleDescri;
@Mapping("rebateVOList")
private List<RebateDTO> rebateDTOList;
public Integer getRebateRuleId() {
return rebateRuleId;
}
public void setRebateRuleId(Integer rebateRuleId) {
this.rebateRuleId = rebateRuleId;
}
public String getRebateRuleName() {
return rebateRuleName;
}
public void setRebateRuleName(String rebateRuleName) {
this.rebateRuleName = rebateRuleName;
}
public String getRebateRuleDescri() {
return rebateRuleDescri;
}
public void setRebateRuleDescri(String rebateRuleDescri) {
this.rebateRuleDescri = rebateRuleDescri;
}
public List<RebateDTO> getRebateDTOList() {
return rebateDTOList;
}
public void setRebateDTOList(List<RebateDTO> rebateDTOList) {
this.rebateDTOList = rebateDTOList;
}
}
RebateDTO
package com.ybl.test.dozer.bean;
/**
* Created by szh on 2017/12/1.
*/
public class RebateDTO {
private Integer rebateId;
private Double rebateRate;
private Double fixed;
private Double upper;
private Double floor;
public Integer getRebateId() {
return rebateId;
}
public void setRebateId(Integer rebateId) {
this.rebateId = rebateId;
}
public Double getRebateRate() {
return rebateRate;
}
public void setRebateRate(Double rebateRate) {
this.rebateRate = rebateRate;
}
public Double getFixed() {
return fixed;
}
public void setFixed(Double fixed) {
this.fixed = fixed;
}
public Double getUpper() {
return upper;
}
public void setUpper(Double upper) {
this.upper = upper;
}
public Double getFloor() {
return floor;
}
public void setFloor(Double floor) {
this.floor = floor;
}
@Override
public String toString() {
return "RebateDTO{" +
"rebateId=" + rebateId +
", rebateRate=" + rebateRate +
", fixed=" + fixed +
", upper=" + upper +
", floor=" + floor +
'}';
}
}
转换测试
package com.ybl.test.dozer;
import com.ybl.test.dozer.bean.*;
import org.dozer.DozerBeanMapper;
import org.dozer.Mapper;
import java.util.ArrayList;
import java.util.List;
/**
* Created by szh on 2017/12/1.
*/
public class ConvertNestProperties {
public static void main(String[] args){
Mapper mapper = new DozerBeanMapper();
RebateRuleDTO rebateRuleDTO = new RebateRuleDTO();
rebateRuleDTO.setRebateRuleId(1);
rebateRuleDTO.setRebateRuleName("测试规则");
rebateRuleDTO.setRebateRuleDescri("不被传递的值");
List<RebateDTO> rebateDTOList = new ArrayList<>();
RebateDTO rebateDTO1 = new RebateDTO();
rebateDTO1.setRebateId(1);
rebateDTO1.setFixed(12.0);
rebateDTO1.setFloor(10.0);
rebateDTO1.setUpper(20.0);
rebateDTOList.add(rebateDTO1);
rebateRuleDTO.setRebateDTOList(rebateDTOList);
System.out.println("DTO to VO");
RebateRuleVO rebateRuleVO = mapper.map(rebateRuleDTO ,RebateRuleVO.class);
System.out.println("RebateRuleVO rebateList size " + rebateRuleVO.getRebateVOList().size());
List<RebateVO> rebateVOListVO = rebateRuleVO.getRebateVOList();
for(int i=0; i<rebateVOListVO.size(); i++){
System.out.println("index " + i);
System.out.println(rebateVOListVO.get(i));
}
}
}