Entity、Dto、Vo的相互转换

1. 对象entity 转换vo

 AuthorityAdmin entity = dao.findId()
 AuthorityAdminVo vo = new AuthorityAdminVo();
 BeanUtils.copyProperties(entity , vo);
 return vo;

2. 对象List< entity> 转换List< vo>

   //  查询数据
   List<UserAdminVo> entityList = dao.findAll()
 
    //处理方法1 = for 循环
   List<UserAdminVo> voList = new ArrayList<>();
   userList.forEach(entity ->{
            UserAdminVo vo = new UserAdminVo();
            BeanUtils.copyProperties(entity , vo);
            voList.add(vo);
    }); 

    //处理方法2
   List<UserAdminVo> voList2 = authorityAdminPage.getContent().stream().map(item -> {
       UserAdminVoVo vo = new UserAdminVoVo();
       BeanUtils.copyProperties(item, vo);
       return vo;
   }).collect(Collectors.toList());

3. 刚开始的 spring data Jpa 下的 Page< T> 转换 Page< VO>

// 查询
Page<UserAdmin> userPage = userAdminServiceImpl.selectPage(........);

// List<entity> 转换List<vo>   -->  userPage .getContent() 
 List<AuthorityAdminVo> collect = userPage .getContent().stream().map(item -> {
       AuthorityAdminVo vo = new AuthorityAdminVo();
       BeanUtils.copyProperties(item, vo);
       return vo;
}).collect(Collectors.toList());

// 重新封装page
Page<V> vs = new PageImpl<>(voList, page.getPageable(), page.getTotalElements());
return vs ;

4. 不知道大家是不是觉得很麻烦,下面我们开始创建工具类

刚开始的 mybatis-plus 下的 Page< T> 转换 IPage< VO>,不是很麻烦,展示一下原生,但也可以简化一下

Page<UserAdmin> page = userAdminServiceImpl.page(this.getPage(), new    LambdaQueryWrapper<UserAdmin>()
                .orderByAsc(UserAdmin::getId)
                .eq(id != null, UserAdmin::getId, id)
                .like(StringUtils.isNotBlank(username), UserAdmin::getUsername, username)
        );
IPage<UserAdminVo> userAdminVoList =  page.convert(item -> item.convert(UserAdminVo.class))

二、创建工具类

package com.ws.ldy.base.entity;

import org.springframework.beans.BeanUtils;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * TODO  Dto,Vo,entity 转换工具类
 *
 * @author ws
 * @mail 1720696548@qq.com
 * @date 2020/2/24 0024 13:08
 */
@SuppressWarnings("all")
public class BeanDtoVoUtils<V, E> {

    /**
     * TODO  dot ,Do ,entity 相互转换
     * 同:BeanUtils.copyProperties(dtoEntity, newInstance);
     *
     * @param oldClass 原数据--Dto,Vo,entity
     * @param newClass 转换为--Dto,Vo,entity
     * @return
     */
    public static <E> E convert(Object oldClass, Class<E> newClass) {
        // 判断oldClass 是否为空!
        if (oldClass == null) {
            return null;
        }
        // 判断newClass 是否为空
        if (newClass == null) {
            return null;
        }
        try {
            // 创建新的对象实例
            E newInstance = newClass.newInstance();
            // 把原对象数据拷贝到新的对象
            BeanUtils.copyProperties(oldClass, newInstance);
            // 返回新对象
            return newInstance;
        } catch (Exception e) {
            return null;
        }
    }
}

1、List< T> 转 List< VO> 方法

//TODO  Page<Entity> 分页对象转 Page<Vo>  ( list 循环)
public static <T, V> Page<V> pageVo(Page<T> page, Class<V> v) {
    try {
        List<T> tList = page.getContent();
        List<V> voList = new ArrayList<>();
        for (T t : tList) {
            V newv = (V) BeanDtoVoUtils.convert(t, v.newInstance().getClass());
            voList.add(newv);
        }
        Page<V> vs = new PageImpl<>(voList, page.getPageable(), page.getTotalElements());
        return vs;
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}


//TODO  Page<Entity> 分页对象转 Page<Vo> (Stream 方式)
public static  <T, V> Page<V> pageVoStream(Page<T> page, Class<V> v) {
    List<V> voList = page.getContent().stream().map(item -> {
        try {
            return (V) BeanDtoVoUtils.convert(item, v.newInstance().getClass());
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return null;
    }).collect(Collectors.toList());
    Page<V> vs = new PageImpl<>(voList, page.getPageable(), page.getTotalElements());
    return vs;
}

2、JPA 的 page 工具类方法

   //TODO  list<Entity> 集合对象转list<Vo> ( list 循环)
    public static <T, V> List<V> listVo(List<T> oldList, Class<V> v) {
        try {
            List<V> voList = new ArrayList<>();
            for (T t : oldList) {
                V newv = (V) BeanDtoVoUtils.convert(t, v.newInstance().getClass());
                voList.add(newv);
            }
            return voList;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }


    //TODO  list<Entity> 集合对象转list<Vo> (Stream 方式)
    public static <T, V> List<V> listVoStream(List<T> oldList, Class<V> v) {
        List<V> voList = oldList.stream().map(item -> {
            try {
                return (V) BeanDtoVoUtils.convert(item, v.newInstance().getClass());
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
            return null;
        }).collect(Collectors.toList());
        return voList;
    }

3、mybatis-plus的 page -> Ipage 工具类方法

   //TODO  Page<Entity> 分页对象转 Page<Vo>  ( list 循环)
    public static <T, V> IPage<V> pageVo(Page<T> page, Class<V> v) {
        IPage<V> vs = page.convert(item -> {
            try {
                V newv = (V) BeanDtoVoUtils.convert(item, v.newInstance().getClass());
                return newv;
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        });
        return vs;
    }

把工具类的方法封装到BaseController (非必需)

/**
     * TODO  dot ,Do ,entity 相互转换
     * 同:BeanUtils.copyProperties(dtoEntity, newInstance);
     *
     * @param oldClass 原数据--Dto,Vo,entity
     * @param newClass 转换为--Dto,Vo,entity
     * @return
     */
    public <E> E convert(Object oldClass, Class<E> newClass) {
        return BeanDtoVoUtils.convert(oldClass, newClass);
    }


    //TODO  Page<Entity> 分页对象转 Page<Vo>  ( list 循环)
    public <T, V> Page<V> pageVo(Page<T> page, Class<V> v) {
        return BeanDtoVoUtils.pageVo(page, v);
    }


    //TODO  Page<Entity> 分页对象转 Page<Vo> (Stream 方式)
    public <T, V> Page<V> pageVoStream(Page<T> page, Class<V> v) {
        return BeanDtoVoUtils.pageVoStream(page, v);
    }


    //TODO  list<Entity> 集合对象转list<Vo> ( list 循环)
    public <T, V> List<V> listVo(List<T> oldList, Class<V> v) {
        return BeanDtoVoUtils.listVo(oldList, v);
    }


    //TODO  list<Entity> 集合对象转list<Vo> (Stream 方式)
    public <T, V> List<V> listVoStream(List<T> oldList, Class<V> v) {
        return BeanDtoVoUtils.listVoStream(oldList, v);
    }

三、使用工具类

Page与List 通过 Stream 方式与 循环方式进行转换
在这里插入图片描述

list展示
在这里插入图片描述

page展示在这里插入图片描述

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于Dto(数据传输对象)、Entity(实体对象)和Vo(视图对象)之间的相互转换,可以使用一些常用的转换方法: 1. Entity to Dto: - 手动映射:通过手动设置Dto的每个属性,将Entity的属性值复制到Dto中。 - 使用BeanUtils.copyProperties:使用类库(如Apache Commons BeanUtils)来自动复制Entity的属性值到Dto中,属性名相同的字段会被复制。 2. Dto to Entity: - 手动映射:通过手动设置Entity的每个属性,将Dto的属性值复制到Entity中。 - 使用BeanUtils.copyProperties:使用类库来自动复制Dto的属性值到Entity中,属性名相同的字段会被复制。 3. Entity to Vo: - 手动映射:通过手动设置Vo的每个属性,将Entity的属性值复制到Vo中。 - 使用BeanUtils.copyProperties:使用类库来自动复制Entity的属性值到Vo中,属性名相同的字段会被复制。 4. Vo to Entity: - 手动映射:通过手动设置Entity的每个属性,将Vo的属性值复制到Entity中。 - 使用BeanUtils.copyProperties:使用类库来自动复制Vo的属性值到Entity中,属性名相同的字段会被复制。 需要注意的是,自动映射可能存在一些问题,例如字段名不一致、类型不匹配等,因此在使用自动映射时需要进行一些额外的配置和处理。另外,在某些复杂的场景下,可能需要使用专门的转换工具或框架,如MapStruct、ModelMapper等来简化转换过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值