IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> java系列 - entityvo转换 -> 正文阅读

[Java知识库]java系列 - entityvo转换

起因

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

如果采用最简单粗暴的方式,那么这个过程应该是这样的:

  1. 创建一个临时ArrayList
  2. 遍历 List ,并在内部调用工具类方法BeanUtil.copyProperties(source,target)将每一个Entity转化为vo
  3. 将每一个复制转换后的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);
    }

封装到工具类后使用

  1. 封装后,将 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);
    }
  1. 封装后,将 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知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-05-11 16:17:11  更:2022-05-11 16:17:53 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 23:21:49-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码