返回顶部
首页 > 资讯 > 后端开发 > Python >Java详解entity转换到vo过程
  • 269
分享到

Java详解entity转换到vo过程

2024-04-02 19:04:59 269人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

目录起因1. 将Entity转化为Vo2. 将List<Entity>转换为List<Vo>封装到工具类后使用性能以及原理ConvertUtil工具类源码起因

起因

使用 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;

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内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java详解entity转换到vo过程

本文链接: https://lsjlt.com/news/152263.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作