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

相关文章

Linux使用fdisk进行磁盘的相关操作

《Linux使用fdisk进行磁盘的相关操作》fdisk命令是Linux中用于管理磁盘分区的强大文本实用程序,这篇文章主要为大家详细介绍了如何使用fdisk进行磁盘的相关操作,需要的可以了解下... 目录简介基本语法示例用法列出所有分区查看指定磁盘的区分管理指定的磁盘进入交互式模式创建一个新的分区删除一个存

C#使用HttpClient进行Post请求出现超时问题的解决及优化

《C#使用HttpClient进行Post请求出现超时问题的解决及优化》最近我的控制台程序发现有时候总是出现请求超时等问题,通常好几分钟最多只有3-4个请求,在使用apipost发现并发10个5分钟也... 目录优化结论单例HttpClient连接池耗尽和并发并发异步最终优化后优化结论我直接上优化结论吧,

SpringBoot使用Apache Tika检测敏感信息

《SpringBoot使用ApacheTika检测敏感信息》ApacheTika是一个功能强大的内容分析工具,它能够从多种文件格式中提取文本、元数据以及其他结构化信息,下面我们来看看如何使用Ap... 目录Tika 主要特性1. 多格式支持2. 自动文件类型检测3. 文本和元数据提取4. 支持 OCR(光学

Java内存泄漏问题的排查、优化与最佳实践

《Java内存泄漏问题的排查、优化与最佳实践》在Java开发中,内存泄漏是一个常见且令人头疼的问题,内存泄漏指的是程序在运行过程中,已经不再使用的对象没有被及时释放,从而导致内存占用不断增加,最终... 目录引言1. 什么是内存泄漏?常见的内存泄漏情况2. 如何排查 Java 中的内存泄漏?2.1 使用 J

JAVA系统中Spring Boot应用程序的配置文件application.yml使用详解

《JAVA系统中SpringBoot应用程序的配置文件application.yml使用详解》:本文主要介绍JAVA系统中SpringBoot应用程序的配置文件application.yml的... 目录文件路径文件内容解释1. Server 配置2. Spring 配置3. Logging 配置4. Ma

Golang的CSP模型简介(最新推荐)

《Golang的CSP模型简介(最新推荐)》Golang采用了CSP(CommunicatingSequentialProcesses,通信顺序进程)并发模型,通过goroutine和channe... 目录前言一、介绍1. 什么是 CSP 模型2. Goroutine3. Channel4. Channe

利用Python编写一个简单的聊天机器人

《利用Python编写一个简单的聊天机器人》这篇文章主要为大家详细介绍了如何利用Python编写一个简单的聊天机器人,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 使用 python 编写一个简单的聊天机器人可以从最基础的逻辑开始,然后逐步加入更复杂的功能。这里我们将先实现一个简单的

Linux使用dd命令来复制和转换数据的操作方法

《Linux使用dd命令来复制和转换数据的操作方法》Linux中的dd命令是一个功能强大的数据复制和转换实用程序,它以较低级别运行,通常用于创建可启动的USB驱动器、克隆磁盘和生成随机数据等任务,本文... 目录简介功能和能力语法常用选项示例用法基础用法创建可启动www.chinasem.cn的 USB 驱动

Java 字符数组转字符串的常用方法

《Java字符数组转字符串的常用方法》文章总结了在Java中将字符数组转换为字符串的几种常用方法,包括使用String构造函数、String.valueOf()方法、StringBuilder以及A... 目录1. 使用String构造函数1.1 基本转换方法1.2 注意事项2. 使用String.valu

C#使用yield关键字实现提升迭代性能与效率

《C#使用yield关键字实现提升迭代性能与效率》yield关键字在C#中简化了数据迭代的方式,实现了按需生成数据,自动维护迭代状态,本文主要来聊聊如何使用yield关键字实现提升迭代性能与效率,感兴... 目录前言传统迭代和yield迭代方式对比yield延迟加载按需获取数据yield break显式示迭