vo与po对象互相转换的通用方法

需求

最近遇到的一个需求,将前端传入的excel进行导入。
问题在于:导入时是用一个excelVO进行接收,但是最终保存数据库的对象应该是PO。
之前的同事写的是每个VO转PO都需要写一个新的方法,这样代码功能都是一样的,只是转换的对象不一样,过于重复。
所以!秉承着[不会偷懒的程序员不是好测试]的原则,写一个VO转PO的通用工具类,避免大量重复呆板的工作。
vo是指返回给前端的对象,po是实体类。

step1

写一个类与类转换的通用方法
需要注意的是,vo和po的属性应该有一部分是有交集的

public class CustomerConvert {

    /**
     * 类型转换
     * @param obj
     * @param clazz
     * @return
     * @throws Exception
     */
    public static Object convert(Object obj, Class clazz) throws Exception {
        Object targetObj = clazz.getDeclaredConstructor().newInstance();
        Class<?> originClass = obj.getClass();
        Field[] fields = originClass.getDeclaredFields();

        for (Field field : fields) {
            if(notValidField(field) || isStaticModifier(field)) {
                continue;
            }
            field.setAccessible(true);
            Object fileAtr = field.get(obj);

            Field field1 = clazz.getDeclaredField(field.getName());
            if(notValidField(field1)) {
                continue;
            }
            field1.setAccessible(true);
            field1.set(targetObj,fileAtr);
        }

        return targetObj;
    }

    private static boolean notValidField(Field field) {
        return Objects.isNull(field);
    }

    private static boolean isStaticModifier(Field field) {
        return Modifier.isStatic(field.getModifiers());
    }

}

step2

转换时都是将一个VO的list转成PO的list,所以以下的方法就是为了达到这种效果

public class CustomerExcelUtils {

    public static <E, T> List<E> createImportList(List<T> excelList, E param) throws Exception {
        Class<?> clazz = param.getClass();
        List<E> importList = excelList.stream()
                .map(item -> {
                    E managePO = null;
                    try {
                        managePO = (E) CustomerConvert.convert(item, clazz);
                    } catch (Exception e) {
                        throw new RuntimeException(e);
                    }

                    isValidItem(managePO);
                    return managePO;
                })
                .collect(Collectors.toList());
        return importList;
    }

    private static <E> void isValidItem(E managePO) {
        if(Objects.isNull(managePO)) {
            throw new RuntimeException("参数异常");
        }
    }
}

使用

	@PostMapping("/importColor")
    @ApiOperation("导入")
    public ResponseInfo<Boolean> importColor(@RequestParam MultipartFile file) throws Exception {
        ImportParams params = ImportExcelUtils.createImportParams(0, 1);

        InputStream is = file.getInputStream();
        List<ColorLcationListExportVO> excelList = ExcelImportUtil.importExcel(is, ColorLcationListExportVO.class, params);

        //优化,createImportList()
        List<ColourLocationListPO> importList = CustomerExcelUtils.createImportList(excelList,new ColourLocationListPO());

        boolean flag = colourLocationListService.saveOrUpdateBatch(importList);

        return ResponseInfo.<Boolean>success().data(flag);
    }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中,可以使用以下两种方式实现PO(Persistent Object)和VO(Value Object)之间的转换: 1. 手动转换 手动转换是最基本的方式,即通过编写转换代码将PO对象转换VO对象或将VO对象转换PO对象。手动转换的优点是灵活性高,可以根据具体需求定制转换过程,缺点是比较繁琐,需要写大量的转换代码。 例如,下面是一个将PO对象转换VO对象的示例代码: ``` public class UserPO { private Long id; private String name; private Integer age; //省略getter和setter方法 } public class UserVO { private Long id; private String name; private Integer age; //省略getter和setter方法 } public class UserConverter { public static UserVO convertToVO(UserPO po) { UserVO vo = new UserVO(); vo.setId(po.getId()); vo.setName(po.getName()); vo.setAge(po.getAge()); return vo; } } ``` 2. 使用第三方库 除了手动转换外,还可以使用一些第三方库来简化转换过程。常用的库有Dozer、ModelMapper、BeanUtils等。这些库可以通过反射机制自动完成对象属性的映射,避免了手动编写转换代码的繁琐过程。 例如,使用Dozer库实现PO对象VO对象转换代码如下: ``` public class UserPO { private Long id; private String name; private Integer age; //省略getter和setter方法 } public class UserVO { private Long id; private String name; private Integer age; //省略getter和setter方法 } public class UserConverter { private static Mapper mapper = DozerBeanMapperBuilder.buildDefault(); public static UserVO convertToVO(UserPO po) { UserVO vo = mapper.map(po, UserVO.class); return vo; } } ``` 使用第三方库的优点是可以大幅减少转换代码的编写量,提高开发效率,但缺点是可能会引入额外的依赖,增加项目的复杂度。另外,不同的库有不同的特点和适用场景,需要根据具体情况选择合适的库。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值