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

2024-05-03 06:38

本文主要是介绍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. 使用前的准备
    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 的简单使用介绍的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/956067

相关文章

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

SpringCloud动态配置注解@RefreshScope与@Component的深度解析

《SpringCloud动态配置注解@RefreshScope与@Component的深度解析》在现代微服务架构中,动态配置管理是一个关键需求,本文将为大家介绍SpringCloud中相关的注解@Re... 目录引言1. @RefreshScope 的作用与原理1.1 什么是 @RefreshScope1.

Java并发编程必备之Synchronized关键字深入解析

《Java并发编程必备之Synchronized关键字深入解析》本文我们深入探索了Java中的Synchronized关键字,包括其互斥性和可重入性的特性,文章详细介绍了Synchronized的三种... 目录一、前言二、Synchronized关键字2.1 Synchronized的特性1. 互斥2.

Spring Boot 配置文件之类型、加载顺序与最佳实践记录

《SpringBoot配置文件之类型、加载顺序与最佳实践记录》SpringBoot的配置文件是灵活且强大的工具,通过合理的配置管理,可以让应用开发和部署更加高效,无论是简单的属性配置,还是复杂... 目录Spring Boot 配置文件详解一、Spring Boot 配置文件类型1.1 applicatio

使用Sentinel自定义返回和实现区分来源方式

《使用Sentinel自定义返回和实现区分来源方式》:本文主要介绍使用Sentinel自定义返回和实现区分来源方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Sentinel自定义返回和实现区分来源1. 自定义错误返回2. 实现区分来源总结Sentinel自定

Mysql表的简单操作(基本技能)

《Mysql表的简单操作(基本技能)》在数据库中,表的操作主要包括表的创建、查看、修改、删除等,了解如何操作这些表是数据库管理和开发的基本技能,本文给大家介绍Mysql表的简单操作,感兴趣的朋友一起看... 目录3.1 创建表 3.2 查看表结构3.3 修改表3.4 实践案例:修改表在数据库中,表的操作主要

Pandas使用SQLite3实战

《Pandas使用SQLite3实战》本文主要介绍了Pandas使用SQLite3实战,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录1 环境准备2 从 SQLite3VlfrWQzgt 读取数据到 DataFrame基础用法:读

JSON Web Token在登陆中的使用过程

《JSONWebToken在登陆中的使用过程》:本文主要介绍JSONWebToken在登陆中的使用过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录JWT 介绍微服务架构中的 JWT 使用结合微服务网关的 JWT 验证1. 用户登录,生成 JWT2. 自定义过滤

Java中StopWatch的使用示例详解

《Java中StopWatch的使用示例详解》stopWatch是org.springframework.util包下的一个工具类,使用它可直观的输出代码执行耗时,以及执行时间百分比,这篇文章主要介绍... 目录stopWatch 是org.springframework.util 包下的一个工具类,使用它

Java进行文件格式校验的方案详解

《Java进行文件格式校验的方案详解》这篇文章主要为大家详细介绍了Java中进行文件格式校验的相关方案,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、背景异常现象原因排查用户的无心之过二、解决方案Magandroidic Number判断主流检测库对比Tika的使用区分zip