`

VO与PO之间相互转换

 
阅读更多

转换基类:

public abstract class BaseConverter<V, P> {

    private static Logger logger = LoggerFactory.getLogger(BaseConverter.class);

    /**
     * 值对象与域对象之间属性复制
     * 
     * @param dto
     *            值对象
     * @param domain
     *            域对象
     * @param flag
     *            复制方向
     */
    protected void copyProperties(V dto, P domain, ConverterFlag flag) {

        switch (flag) {

            case PO2VO:
                copySameProperties(dto, domain);
                copyDiffPropertiesFromPO2VO(dto, domain);
                break;

            case VO2PO:
                copySameProperties(domain, dto);
                copyDiffPropertiesFromVO2PO(domain, dto);
                break;

            default:
                break;
        }

    }

    /**
     * 同名属性复制
     * 
     * @param target
     *            目标对象
     * @param source
     *            来源对象
     */
    protected void copySameProperties(Object target, Object source) {

        try {
            RtsBeanUtil.copyProperties(target, source);
        } catch (IllegalAccessException e) {
            logger.error("对象属性值复制出错:原数据为{}, 目标数据为{}。", source, target);
        } catch (InvocationTargetException e) {
            logger.error("对象属性值复制出错:原数据为{}, 目标数据为{}。", source, target);
        }
    }

    /**
     * VO非同名属性复制到PO属性
     * 
     * @param target
     *            域对象
     * @param source
     *            值对象
     */
    public abstract void copyDiffPropertiesFromVO2PO(P target, V source);

    /**
     * PO非同名属性复制到VO属性
     * 
     * @param target
     *            值对象
     * @param source
     *            域对象
     */
    public abstract void copyDiffPropertiesFromPO2VO(V target, P source);

}


日期转换工具:
public class DateConverter implements Converter {

    @SuppressWarnings("rawtypes")
    @Override
    public Object convert(Class type, Object value) {

        if (value == null) {
            return null;
        }

        // 相同类型不需要转换
        if (type.equals(value.getClass())) {
            return value;
        }

        // 字符串转日期格式
        if (value instanceof String) {
            return DateUtil.getDateFormatStr(((String) value).trim(),
                DateUtil.DATA_FORMAT_PATTERN);
        }

        // 其他不支持
        return null;
    }
}


注册自定义转换机制:
public class CustomerBeanUtil extends BeanUtils {

    private RtsBeanUtil() {

    }

    static {
        // 注册sql.date的转换器,即允许BeanUtils.copyProperties时的源目标的sql类型的值允许为空
        ConvertUtils.register(new SqlDateConverter(), java.util.Date.class);
        // 注册util.date的转换器,即允许BeanUtils.copyProperties时的源目标的util类型的值允许为空
        ConvertUtils.register(new DateConverter(), java.util.Date.class);
    }

    public static void copyProperties(Object target, Object source)
        throws InvocationTargetException, IllegalAccessException {

        BeanUtils.copyProperties(target, source);
    }

}


转换例子:
public class ParamConverter extends BaseConverter<ParamDTO, ParamInfo> {

    public ParamDTO getParamDTO(ParamInfo apply) {

        ParamDTO paramDTO = new ParamDTO();
        copyProperties(paramDTO, apply, ConverterFlag.PO2VO);

        return paramDTO;
    }

    public ParamInfo getParamInfo(ParamDTO paramDTO) {

        ParamInfo apply = new ParamInfo();
        copyProperties(paramDTO, apply, ConverterFlag.VO2PO);

        return apply;
    }

    @Override
    public void copyDiffPropertiesFromVO2PO(ParamInfo target, ParamDTO source) {

        target.setParamCode(source.getParam().getCode());
        target.setParamName(source.getParam().getText());

    }

    @Override
    public void copyDiffPropertiesFromPO2VO(ParamDTO target, ParamInfo source) {

        target.setParam(ParamCode.findByCode(source.getParamCode()));

    }

}




至此,VO与PO之间的转换完成,其中主要用的第三份工具 BeanUtil
分享到:
评论

相关推荐

    java的几种对象(PO_VO_DAO_BO_POJO)解释

    在实体框架或ORM(对象关系映射)工具中,PO对象作为桥梁,将Java对象与数据库记录相互转换,使得开发者能够以面向对象的方式操作数据库数据。 ### 值对象(VO) 值对象(VO)是一种无状态的对象,它代表了一组值...

    java实现相同属性名称及相似类型的pojo、dto、vo等互转操作

    POJO、DTO、VO 等都是 Java 中常用的类别,但是它们之间的转换却是一件复杂的事情,需要我们对 Java 的反射机制、泛型、基本类型等有深入的了解。 首先,我们需要了解什么是 POJO、DTO、VO。POJO 是 Plain Ordinary...

    java中的缩写

    这些概念并非孤立存在,它们之间存在着紧密的联系和相互转化的过程。例如,PO可以作为BO的一部分,用来存储和读取数据;VO则可能由多个PO组合而成,以满足特定的显示需求。在实际应用中,一个BO可能会调用多个DAO...

    hibernate配置要点详谈

    - VO与PO之间的相互转换可以使用`BeanUtils.copyProperties()`方法实现。 #### 十、延迟加载与非延迟加载 - **延迟加载**: - 如果采用了延迟加载机制但希望在某些情况下实现非延迟加载,可以通过`Hibernate....

    SSH详细简介

    "SSH框架详解" SSH框架是由Struts、Spring、Hibernate三个主体组件组成的,它们分别负责Web层、业务层和持久化层的工作。下面我们将详细介绍SSH框架中的每个...三者之间的相互协作,实现了整个系统的自动化和高效化。

    pic变压器常用规格书

    这不仅涵盖了输入电压范围、输出电压、电流密度、电感等关键指标,还涉及了设计过程中考虑的各种物理量之间的相互关系和计算方法。 ### 一、基本设计参数 #### 输入电压范围 输入电压范围设定为90VAC到264VAC,这...

    Java编码辅助工具Mapstruct用法详解

    在项目开发中,业务分层会涉及不同类型的Bean之间需要相互转换,如PO与DTO之间,PO与VO之间等。手动编码setter/getter各个对应属性,会显得臃肿繁琐。通过Mapstruct框架可简单方便地完成这一工作。 如何引入Map...

    浅谈Action+Service +Dao 功能

    数据的流向是:ActionFormBean接受用户的数据,Action将数据从ActionFormBean中取出,封装成VO或PO,再调用业务层的Bean类,完成各种业务处理后再Forward。 4. SSH框架的优点 Hibernate的最大好处就是根据数据库的...

    vsked领域驱动设计1

    例如,PO(Persistent Object)层就是用于将领域对象转化为数据库中的持久化对象,如ORM(对象关系映射)框架。视图对象(View Object,如VO)则是用于在展示层中传递数据的对象,它们通常用于界面渲染。 分层架构...

    阿里云java规范

    1. **解析**:对象关系映射(ORM)是一种将对象模型与数据库模型相互转换的技术。这部分内容提供了关于如何正确使用ORM框架的指导,以提高开发效率和代码质量。 #### 六、工程结构 1. **解析**:工程结构部分主要...

Global site tag (gtag.js) - Google Analytics