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

相关文章

一篇文章彻底搞懂macOS如何决定java环境

《一篇文章彻底搞懂macOS如何决定java环境》MacOS作为一个功能强大的操作系统,为开发者提供了丰富的开发工具和框架,下面:本文主要介绍macOS如何决定java环境的相关资料,文中通过代码... 目录方法一:使用 which命令方法二:使用 Java_home工具(Apple 官方推荐)那问题来了,

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

详解SpringBoot+Ehcache使用示例

《详解SpringBoot+Ehcache使用示例》本文介绍了SpringBoot中配置Ehcache、自定义get/set方式,并实际使用缓存的过程,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录摘要概念内存与磁盘持久化存储:配置灵活性:编码示例引入依赖:配置ehcache.XML文件:配置

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

k8s按需创建PV和使用PVC详解

《k8s按需创建PV和使用PVC详解》Kubernetes中,PV和PVC用于管理持久存储,StorageClass实现动态PV分配,PVC声明存储需求并绑定PV,通过kubectl验证状态,注意回收... 目录1.按需创建 PV(使用 StorageClass)创建 StorageClass2.创建 PV

Redis 基本数据类型和使用详解

《Redis基本数据类型和使用详解》String是Redis最基本的数据类型,一个键对应一个值,它的功能十分强大,可以存储字符串、整数、浮点数等多种数据格式,本文给大家介绍Redis基本数据类型和... 目录一、Redis 入门介绍二、Redis 的五大基本数据类型2.1 String 类型2.2 Hash

Java中的.close()举例详解

《Java中的.close()举例详解》.close()方法只适用于通过window.open()打开的弹出窗口,对于浏览器的主窗口,如果没有得到用户允许是不能关闭的,:本文主要介绍Java中的.... 目录当你遇到以下三种情况时,一定要记得使用 .close():用法作用举例如何判断代码中的 input

Redis中Hash从使用过程到原理说明

《Redis中Hash从使用过程到原理说明》RedisHash结构用于存储字段-值对,适合对象数据,支持HSET、HGET等命令,采用ziplist或hashtable编码,通过渐进式rehash优化... 目录一、开篇:Hash就像超市的货架二、Hash的基本使用1. 常用命令示例2. Java操作示例三

Linux创建服务使用systemctl管理详解

《Linux创建服务使用systemctl管理详解》文章指导在Linux中创建systemd服务,设置文件权限为所有者读写、其他只读,重新加载配置,启动服务并检查状态,确保服务正常运行,关键步骤包括权... 目录创建服务 /usr/lib/systemd/system/设置服务文件权限:所有者读写js,其他