原來不管是實體類對象T 還是List 還是Page 的Entity、Dto、Vo的相互轉換還能怎麼簡單

一、始起

不知道大家在前端傳遞Dto到後臺,是如何把Dto 轉換成實體類的
也不知道大家是這麼把數據庫查詢的Entity對象數據是如何轉化成Vo數據的

剛開始對象entity 轉換vo

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

剛開始對象List 轉換List

   //  查詢數據
   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());

剛開始的 spring data Jpa 下的 Page 轉換 Page

// 查詢
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 ;

不知道大家是不是覺得很麻煩,下面我們開始創建工具類

二、創建工具類

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 [email protected]
 * @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;
        }
    }



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


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

把工具類的方法封裝到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 方式與 循環方式進行轉換

API 參數說明 返回值
BeanDtoVoUtils.convert(Object oldClass, Class newClass) 原對象,轉換後類對象 接收類
BeanDtoVoUtils.pageVo(Page page, Class v) 原對象page,轉換後類對象 Page<轉換後類對象>
BeanDtoVoUtils.listVo(List oldList, Class v) 原對象List List<轉換後類對象>
BeanDtoVoUtils.pageVoStream(Page page, Class v) 原對象page,轉換後類對象 Page<轉換後類對象>
BeanDtoVoUtils listVoStream(List oldList, Class v) 原對象List List<轉換後類對象>

list展示
在這裏插入圖片描述
page展示在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章