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;
    }

    @Override
    public String toString() {
        return "SameVO{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", tel='" + tel + '\'' +
                '}';
    }

    @Override
    public 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;
    }

    @Override
    public String toString() {
        return "SameDTO{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", tel='" + tel + '\'' +
                ", address='" + address + '\'' +
                '}';
    }

    @Override
    public 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;
    }

    @Override
    public 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;
    }

    @Override
    public 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;
    }

    @Override
    public 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;
    }

    @Override
    public 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));
        }

    }

}




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值