参考文档:

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. 1并行对象层次
  2. 使用前的准备
    1. 1 下载以下的部分
    2. 2 第一个映射
    3. 3 通过XML文件指示用户映射文件
    4. 4 Dozer和依赖注入框架
  3. 使用
    1. 1普通使用

      1. 11 Dozer Bean映射
      2. 12注入定制的映射文件
  4. 通过标注映射
  5. 通过API进行映射
  6. 通过XML进行映射
    1. 1两个类之间的映射
    2. 2基本属性映射
      1. 21隐式属性映射
      2. 22简单映射双向
      3. 23数据类型转换
      4. 24递归映射双向
    3. 3字符串到日期的映射
    4. 4 Enum之间的映射
    5. 5容器之间的映射
      1. 51容器和数组之间的映射

        1. 511 为容器映射提供提示
        2. 512 使用Jdk15的泛型来实现容器之间的映射
        3. 613 对象数组到List的转换双向的
        4. 514 原始类型的数组到原始类型的数组的映射双向
        5. 515 类积和非类积List映射双向的
        6. 515 移除孤独数据
      2. 6Map支持的属性映射
        1. 61Map到Map映射
        2. 62 映射一个属性级的属性到一个javautilMap或一个定制的Map有唯一的GetSet方法
        3. 63 映射一个类性级的属性到一个javautilMap或一个定制的Map有唯一的GetSet方法
      3. 7索引映射
      4. 8深度映射
        1. 81深度属性映射
        2. 82深度索引映射
      5. 9排除的字段映射
        1. 91 wildcard 排除默认的映射字段
        2. 92排除映射Null值
        3. 93排除映射空值
      6. 10单向映射
      7. 11基于上下文的映射
      8. 12全局配置
        1. 121全局配置
        2. 122 重写wildcards属性
        3. 123 重写日期格式
        4. 124 重写错误处理信息
        5. 125 重写空字符串的策略
      9. 13自定义转换
      10. 14自定义Bean工厂
      11. 15自定义创建方法
      12. 16自定义GetSet方法
      13. 17通过引用来复制对象映射
      14. 18继承映射

三. 常用的例子展示

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;}@Overridepublic String toString() {return "SameVO{" +"id=" + id +", name='" + name + '\'' +", tel='" + tel + '\'' +'}';}@Overridepublic 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;}@Overridepublic String toString() {return "SameDTO{" +"id=" + id +", name='" + name + '\'' +", tel='" + tel + '\'' +", address='" + address + '\'' +'}';}@Overridepublic 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;}@Overridepublic 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;}@Overridepublic 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;}@Overridepublic 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;}@Overridepublic 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));}}}

JavaEE_领域模型命名规约 与 dozer 的简单使用介绍相关推荐

  1. 领域模型命名规约【PO,VO,POJO,BO,DTO,DO,JavaBean】

    PO,VO,POJO,BO,DTO,DO,JavaBean 在这之前我先说一下,在阿里巴巴开发手册中有提到这种领域模型命名规约,即如下图: 下面是更加详细的介绍: po PO(Persistant O ...

  2. 分层领域模型规约与领域模型命名规约

    一.分层领域模型规约 DO(Data Object):与数据库表结构一一对应,通过DAO层向上传输数据源对象. DTO(Data Transfer Object):数据传输对象,Service或Man ...

  3. java vo命名规则_阿里java开发手册中命名规约解读之DO/BO/DTO/VO/AO

    前言 在阅读<阿里巴巴Java开发手册>时,看到命名规则中有这样一条 虽然知道这些是根据Java对象的角色所分配名称的后缀,但是没有弄清楚分别是什么意思,日常开发中也没有使用到. 网上查找 ...

  4. 阿里巴巴Java开发规范·各层命名规约

    1. Service / DAO 层方法命名规约 方法功能 前缀 说明 获取单个对象的方法 get getObject 获取多个对象的方法 list 复数形式结尾 listObjects 获取统计值的 ...

  5. 命名规约+权限修饰符+封装+特征修饰符

    命名规约 类名首字母大写 属性.方法.变量首字母小写,第二个大写 构造方法与类名一致,首字母大写 包:全部字母小写,注意区分关键字 静态常量:全部字母大写 私有属性对应的方法setName/getNa ...

  6. eve模拟器华为镜像_EVE-NG简单入门介绍

    此篇文章简单的介绍下模拟器EVE-NG的使用,具体包括Dynamips设备导入与运行,IOL设备的导入与运行,QEMU设备的导入与运行,客户端软件的安装,物理网络与虚拟网络的结合等. 一.导入镜像 D ...

  7. linux 运行eve,EVE-NG简单入门介绍

    此篇文章简单的介绍下模拟器EVE-NG的使用,具体包括Dynamips设备导入与运行,IOL设备的导入与运行,QEMU设备的导入与运行,客户端软件的安装,物理网络与虚拟网络的结合等. 导入镜像 Dyn ...

  8. linux的简单命令介绍2

    Linux的简单命令介绍2 1.grep:文本过滤命令,默认情况下,符合要求的会整行显示出来 ls -l | grep "^d":查看当前文件夹里面以d开头的文件, | :这是个管 ...

  9. EVE-NG简单入门介绍

    此篇文章简单的介绍下模拟器 EVE-NG 的使用,具体包括 Dynamips 设备导入与运行, IOL 设备的导入与运行, QEMU 设备的导入与运行,客户端软件的安装,物理网络与虚拟网络的结合等. ...

最新文章

  1. row number mysql_MySQL中的ROW_NUMBER()
  2. chrome中F12工具说明
  3. 一些Java开发人员在编程中常见的雷!
  4. 0502团队项目 SCRUM团队成立
  5. CGCTF-Web-签到题
  6. dede搜索正文内容search.php,织梦dede后台怎么查找文章内容关键词
  7. 算法与数据结构简单启蒙,我当年学习算法走过的坑
  8. 百度的71个非常厉害的开源项目
  9. 【数值分析】python实现复化高斯积分
  10. 最新大数据资料合集.pdf
  11. spring的依赖注入是什么意思
  12. 公网ip和域名是干嘛的?域名由谁管理的?
  13. 「面向对象程序设计-C++」学习笔记(下半部分)
  14. 【Codevs1422】【网络流】河城荷取
  15. python一行输入n个数据
  16. 17-面向对象之语法(2)
  17. Latex中如何使用中文?
  18. 清除IE浏览器SSL缓存
  19. 数据库系统原理学习(三)--PG数据定义与操作
  20. 2020中国机器人公司排行榜TOP10揭晓

热门文章

  1. 乘法分配律逆运算是什么意思_什么是乘法分配律的逆运算
  2. macs14_苹果为什么要转向ARM,并且仍将支持Intel Macs?
  3. 3D人脸识别——点云转化为可训练的图片
  4. 四元数转yaw、pitch、roll
  5. 【8005】如何设置idea汉化中文?
  6. 闪电网络与以太坊结合建立支付渠道的构想及其前景
  7. Eigen 常用操作
  8. 安全开发之w9scan扫描器源码学习
  9. 央行货币与私人货币:经济学家Eswar Prasad谈“货币的未来”
  10. Docker网络容器通信