Java詳解entity轉換到vo過程

起因

使用 mybatis-plus 操作後獲得的數據類型為 Entity,但是前端界面往往需要展示一些其他的字段數據,此時就需要 將 Entity 轉化為 Vo。

那麼他們三者的關系是什麼呢?面向的使用對象不同

entity: 對應數據庫表模型

vo: 對應需要返回到前端的數據模型

dto: 對應後臺內部調用的數據模型

package com.springblog.entity.vo;
import lombok.Data;
import java.io.Serializable;
@Data
public class BlogVo implements Serializable {
    private String title;
    /**
     * 前端需要展示的其他字段
     */
    private String otherProperty;
}
package com.springblog.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import java.time.LocalDateTime;
import java.io.Serializable;
import lombok.Data;
import javax.validation.constraints.NotBlank;
@Data
@TableName("m_blog")
public class BlogEntity implements Serializable {
    private static final long serialVersionUID = 1L;
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    private String title;
    private String description;
    private String content;
    private LocalDateTime created;
}

1. 將Entity轉化為Vo

    @GetMapping("/one/{id}")
    public R oneDefine(@PathVariable(name = "id") Long id) {
        BlogEntity blogEntity = blogService.queryBlogById(id);
        BlogVo blogVo = new BlogVo();
        BeanUtil.copyProperties(blogEntity,blogVo);
        blogVo.setOtherProperty("前端展示額外字段");
        return R.ok().put("data", blogVo);
    }

2. 將List<Entity>轉換為List<Vo>

如果采用最簡單粗暴的方式,那麼這個過程應該是這樣的:

  • 創建一個臨時ArrayList
  • 遍歷 List ,並在內部調用工具類方法BeanUtil.copyProperties(source,target)將每一個Entity轉化為vo
  • 將每一個復制轉換後的voItem 通過add()方法添加到臨時創建的List中

過於繁瑣,這很不好

    @GetMapping("/list1")
    public R list1(@RequestBody Map<String, Object> params) {
        QueryWrapper<BlogEntity> queryWrapper = new QueryWrapper<>();
        List<BlogEntity> list = blogMapper.selectList(queryWrapper);
        ArrayList<BlogVo> voList = new ArrayList<>();
        list.forEach(item->{
            BlogVo voItem = new BlogVo();
            BeanUtil.copyProperties(item,voItem);
            voList.add(voItem);
        });
        return R.ok().put("data", voList);
    }

封裝到工具類後使用

封裝後,將 Entity 轉化為 Vo

    @GetMapping("/one/{id}")
    public R oneDefine(@PathVariable(name = "id") Long id) {
        BlogEntity blogEntity = blogService.queryBlogById(id);
        BlogVo blogVo = ConvertUtil.entityToVo(blogEntity, BlogVo.class);
        blogVo.setOtherProperty("前端展示額外字段");
        return R.ok().put("data", blogVo);
    }

封裝後,將 List<Entity> 轉換為List<Vo>

    @GetMapping("/list1")
    public R list1(@RequestBody Map<String, Object> params) {
        QueryWrapper<BlogEntity> queryWrapper = new QueryWrapper<>();
        List<BlogEntity> list = blogMapper.selectList(queryWrapper);
        List<BlogVo> blogVos = ConvertUtil.entityToVoList(list, BlogVo.class);
        return R.ok().put("data", blogVos);
    }

性能以及原理

  • 使用Spring提供的BeanUtil在日常使用足夠瞭,如果涉及到數據量很大的情況,復制就比較耗時瞭,推介使用Mapstruct。
  • Spring和Apache的BeanUtils則是用到瞭反射機制,都是淺拷貝
  • MapStruct使用註解處理器生成實現類,實現類內部是原生的new對象,然後SetXxx/getXxx方式賦值進行數據拷貝的,類似lombok
  • Apache提供的BeanUtils相對使用的較少

ConvertUtil工具類源碼

package com.springblog.common.utils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
/**
 * @Author ifredom
 * @Description 類型轉換: Entity - Vo轉換
 * @Date 2022/5/10 15:59
 * @Param [params]
 **/
public class ConvertUtil {
    public static final Logger logger = LoggerFactory.getLogger(ConvertUtil.class);
    public static <T> T entityToVo(Object source, Class<T> target) {
        if (source == null) {
            return null;
        }
        T targetObject = null;
        try {
            targetObject = target.newInstance();
            BeanUtils.copyProperties(source, targetObject);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return targetObject;
    }
    public static <T> List<T> entityToVoList(Collection<?> sourceList, Class<T> target) {
        if (sourceList == null) {
            return null;
        }
        List<T> targetList = new ArrayList<>(sourceList.size());
        try {
            for (Object source : sourceList) {
                T targetObject = target.newInstance();
                BeanUtils.copyProperties(source, targetObject);
                targetList.add(targetObject);
            }
        } catch (Exception e) {
            logger.error("convert error ", e);
        }
        return targetList;
    }
}

到此這篇關於Java詳解entity轉換到vo過程的文章就介紹到這瞭,更多相關Java entity轉vo內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: