JavaEE_领域模型命名规约 与 dozer 的简单使用介绍
参考文档:
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 第一个映射
- 3 通过XML文件指示用户映射文件
- 4 Dozer和依赖注入框架
- 使用
- 1普通使用
- 11 Dozer Bean映射
- 12注入定制的映射文件
- 1普通使用
- 通过标注映射
- 通过API进行映射
- 通过XML进行映射
- 1两个类之间的映射
- 2基本属性映射
- 21隐式属性映射
- 22简单映射双向
- 23数据类型转换
- 24递归映射双向
- 3字符串到日期的映射
- 4 Enum之间的映射
- 5容器之间的映射
- 51容器和数组之间的映射
- 511 为容器映射提供提示
- 512 使用Jdk15的泛型来实现容器之间的映射
- 613 对象数组到List的转换双向的
- 514 原始类型的数组到原始类型的数组的映射双向
- 515 类积和非类积List映射双向的
- 515 移除孤独数据
- 6Map支持的属性映射
- 61Map到Map映射
- 62 映射一个属性级的属性到一个javautilMap或一个定制的Map有唯一的GetSet方法
- 63 映射一个类性级的属性到一个javautilMap或一个定制的Map有唯一的GetSet方法
- 7索引映射
- 8深度映射
- 81深度属性映射
- 82深度索引映射
- 9排除的字段映射
- 91 wildcard 排除默认的映射字段
- 92排除映射Null值
- 93排除映射空值
- 10单向映射
- 11基于上下文的映射
- 12全局配置
- 121全局配置
- 122 重写wildcards属性
- 123 重写日期格式
- 124 重写错误处理信息
- 125 重写空字符串的策略
- 13自定义转换
- 14自定义Bean工厂
- 15自定义创建方法
- 16自定义GetSet方法
- 17通过引用来复制对象映射
- 18继承映射
- 51容器和数组之间的映射
三. 常用的例子展示
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 的简单使用介绍相关推荐
- 领域模型命名规约【PO,VO,POJO,BO,DTO,DO,JavaBean】
PO,VO,POJO,BO,DTO,DO,JavaBean 在这之前我先说一下,在阿里巴巴开发手册中有提到这种领域模型命名规约,即如下图: 下面是更加详细的介绍: po PO(Persistant O ...
- 分层领域模型规约与领域模型命名规约
一.分层领域模型规约 DO(Data Object):与数据库表结构一一对应,通过DAO层向上传输数据源对象. DTO(Data Transfer Object):数据传输对象,Service或Man ...
- java vo命名规则_阿里java开发手册中命名规约解读之DO/BO/DTO/VO/AO
前言 在阅读<阿里巴巴Java开发手册>时,看到命名规则中有这样一条 虽然知道这些是根据Java对象的角色所分配名称的后缀,但是没有弄清楚分别是什么意思,日常开发中也没有使用到. 网上查找 ...
- 阿里巴巴Java开发规范·各层命名规约
1. Service / DAO 层方法命名规约 方法功能 前缀 说明 获取单个对象的方法 get getObject 获取多个对象的方法 list 复数形式结尾 listObjects 获取统计值的 ...
- 命名规约+权限修饰符+封装+特征修饰符
命名规约 类名首字母大写 属性.方法.变量首字母小写,第二个大写 构造方法与类名一致,首字母大写 包:全部字母小写,注意区分关键字 静态常量:全部字母大写 私有属性对应的方法setName/getNa ...
- eve模拟器华为镜像_EVE-NG简单入门介绍
此篇文章简单的介绍下模拟器EVE-NG的使用,具体包括Dynamips设备导入与运行,IOL设备的导入与运行,QEMU设备的导入与运行,客户端软件的安装,物理网络与虚拟网络的结合等. 一.导入镜像 D ...
- linux 运行eve,EVE-NG简单入门介绍
此篇文章简单的介绍下模拟器EVE-NG的使用,具体包括Dynamips设备导入与运行,IOL设备的导入与运行,QEMU设备的导入与运行,客户端软件的安装,物理网络与虚拟网络的结合等. 导入镜像 Dyn ...
- linux的简单命令介绍2
Linux的简单命令介绍2 1.grep:文本过滤命令,默认情况下,符合要求的会整行显示出来 ls -l | grep "^d":查看当前文件夹里面以d开头的文件, | :这是个管 ...
- EVE-NG简单入门介绍
此篇文章简单的介绍下模拟器 EVE-NG 的使用,具体包括 Dynamips 设备导入与运行, IOL 设备的导入与运行, QEMU 设备的导入与运行,客户端软件的安装,物理网络与虚拟网络的结合等. ...
最新文章
- row number mysql_MySQL中的ROW_NUMBER()
- chrome中F12工具说明
- 一些Java开发人员在编程中常见的雷!
- 0502团队项目 SCRUM团队成立
- CGCTF-Web-签到题
- dede搜索正文内容search.php,织梦dede后台怎么查找文章内容关键词
- 算法与数据结构简单启蒙,我当年学习算法走过的坑
- 百度的71个非常厉害的开源项目
- 【数值分析】python实现复化高斯积分
- 最新大数据资料合集.pdf
- spring的依赖注入是什么意思
- 公网ip和域名是干嘛的?域名由谁管理的?
- 「面向对象程序设计-C++」学习笔记(下半部分)
- 【Codevs1422】【网络流】河城荷取
- python一行输入n个数据
- 17-面向对象之语法(2)
- Latex中如何使用中文?
- 清除IE浏览器SSL缓存
- 数据库系统原理学习(三)--PG数据定义与操作
- 2020中国机器人公司排行榜TOP10揭晓