Java详解entity转换到vo过程

目录
  • 起因
  • 1. 将Entity转化为Vo
  • 2. 将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;
/**
 * @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内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • java中VO的使用解析

    目录 java中VO的使用 场景 java里VO是什么 1.PO:persistant object 持久对象 2.VO:value object值对象 java中VO的使用 场景 现在我们需要从数据库中查询用户列表t_user,对应的实体类如下: import io.swagger.annotations.ApiModelProperty; public class User { @ApiModelProperty(value = "用户id") private String use

  • java中VO和DTO之间的转换实现

    目录 一.背景 二.详细讲解 注意 三.实体对象间的转换 四.第一种方法的具体代码例子 五.第二种方法的具体代码例子(使用dozer) 六.结束 一.背景 1.领域模型中的实体类分为四种类型:VO.DTO.DO.PO 二.详细讲解 1.VO(View Object),视图对象,用于展示层,它的作用是把某个指定页面(或组件)的所有数据封装起来. 2.DTO(Data Transfer Object),数据传输对象,这个概念来源于J2EE的设计模式,原来的目的是为了EJB的分布式应用提供粗粒度的数据

  • Java实体类(entity)作用说明

    对java实体类的众多理解: A .就是属性类,通常定义在model层里面 B. 一般的实体类对应一个数据表,其中的属性对应数据表中的字段. 好处: 1.对对象实体的封装,体现OO思想. 2.属性可以对字段定义和状态进行判断和过滤 3.把相关信息用一个实体类封装后,我们在程序中可以把实体类作为参数传递,更加方便. C. 说白了就是为了让程序员在对数据库操作的时候不用写SQL语句 D. 就是一个数据库表生成一个类 这样做对数据库操作起来方便 编写代码较少 提高效率 可以使程序员专注逻辑关系 E.

  • java 后台开发中model与entity(实体类)的区别说明

    以前在做项目的时候不太了解model与entity的含义,在公司(卓~)项目中学习到了.model的字段>entity的字段,并且model的字段属性可以与entity不一致,model是用于前端页面数据展示的,而entity则是与数据库进行交互做存储用途. 举个例子: 比如在存储时间的类型时,数据库中存的是datetime类型,entity获取时的类型是Date()类型,date型的数据在前端展示的时候必须进行类型转换(转为String类型),在前端的进行类型转换则十分的麻烦,转换成功了代码也

  • Java详解entity转换到vo过程

    目录 起因 1. 将Entity转化为Vo 2. 将List<Entity>转换为List<Vo> 封装到工具类后使用 性能以及原理 ConvertUtil工具类源码 起因 使用 mybatis-plus 操作后获得的数据类型为 Entity,但是前端界面往往需要展示一些其他的字段数据,此时就需要 将 Entity 转化为 Vo. 那么他们三者的关系是什么呢?面向的使用对象不同 entity: 对应数据库表模型 vo: 对应需要返回到前端的数据模型 dto: 对应后台内部调用的数据

  • 详解Spring ApplicationContext加载过程

    1.找准入口,使用ClassPathXmlApplicationContext的构造方法加载配置文件,用于加载classPath下的配置文件 //第一行,执行完成之后就完成了spring配置文件的加载,刷新spring上下文 ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext( "classpath:spring-mvc.xml"); //获取实例Bean Person person=con

  • Java 详解异常的处理机制

    目录 1.异常概述与异常体系结构 1.1异常概述 1.2运行时异常与编译时异常 1.3异常体系结构 2.常见异常 1. ArrayIndexOutOfBoundsException 2.NullPointerException 3.ArithmeticException 4.ClassCastException 3.异常处理机制 3.1异常的抛出与捕获 3.2异常处理机制:try-catch-finally 5.用户自定义异常类 6.异常处理5个关键字 1.异常概述与异常体系结构 1.1异常概述

  • Java详解ScriptEngine接口动态执行JS脚本

    目录 简介 Eval(String script) 描述 实例代码 Put() and Get() 描述 实例代码 CompiledScript 描述 实例代码 Bindings 描述 实例代码 大多的方法描述都来自于jdk11API帮助文档,由于是机翻,可能有些难以理解,大家多多担待 简介 首先来看一下JDK11API文档中对ScriptEngine的描述 模块 java.scripting 软件包 javax.script Interface ScriptEngin public inter

  • Java 详解包装类Integer与int有哪些共通和不同

    目录 1.包装类型是什么? 2.基本类型和包装类型有什么区别? 3.解释一下自动装箱和自动拆箱? 4.int 和 Integer 有什么区别? 5.两个new生成的Integer变量的对比 6.Integer变量和int变量的对比 7.非new生成的Integer变量和new Integer()生成变量的对比 8.两个非new生成的Integer对象的对比 1.包装类型是什么? Java 为每一个基本数据类型都引入了对应的包装类型,int 的包装类就是 Integer,从 Java 5 开始引入

  • Java详解数据类型的定义与使用

    目录 标识符和关键字 标识符 什么是标识符 标识符的定义规则 关键字 常量和变量 常量 变量 变量的声明格式 变量的声明 基本数据类型 整数类型 浮点类型 浮点类型常量 浮点类型变量 字符类型 字符型 字符串型 布尔类型 基本数据类型的转换 自动类型转换 强制类型转换 标识符和关键字 标识符 读音 biao zhi fu 什么是标识符 包.类.变量.方法…等等,只要是起名的地方,那个名字就是标识符 标识符的定义规则 四个可以:可以是数字.字母.下划线(_).美元符号($),我们一般起名尽量使用英

  • Java详解IO流创建读取与写入操作

    目录 概念 io流对应的方法 一.File方法(创建文件) 二.FileInputStream(获取字节方法)输入流 三.FileOutputStream(写入字节方法)输出流 总结 概念 IO流可以初步的理解为数据间的传输,我们将一组数据入:1234567,将他们从hello文件中转入haha文件中,使用程序的方法进行转入的话则需要一个一个的传入,即为一个字节一个字节的传输,我们每次只能传入或读取一个字节,这就是io流的大致流程,io流对任何类型的文件都可以进行读取.如:文本文件,图片,歌曲m

  • Java详解对象终止方法finalize()的用法

    finalize()方法机制 Java 语言提供了对象终止(finalization)机制来允许开发人员提供对象被销毁之前的自定义处理逻辑. 当GC去回收垃圾时, 总会在即将回收之前调用这个对象的 finalize()方法 , 一个对象finalize()方法只会被调用一次 finalize()方法可以被重写,通常在这个方法中进行一些资源释放和清理的工作,比如关闭文件.套接字和数据库连接等. 我们一般最好不要主动去调用对象的finalize()方法, 理由有以下三点 : 1.在 finalize

  • Java详解AVL树的应用

    目录 一.什么是AVL树 1.二叉搜索树 2.为什么引入了AVL树 3.什么是AVL树 二.自己构造AVL树 三.AVL树的插入和删除 1.插入 1.1.右单旋 1.2.左单旋 1.3.左右双旋 1.4.右左双旋 2.删除 一.什么是AVL树 在认识AVL树之前我们先认识一下什么是二叉搜索树: 1.二叉搜索树 二叉搜索树又称为二叉排序树,二叉搜索树满足所有的左孩子节点都小于其根节点的值,所有的右孩子节点都大于其根节点的值,二叉搜索树上的每一棵子树都是一棵二叉搜索树,因此二叉搜索树通过中序遍历可以

  • Java详解实现多线程的四种方式总结

    目录 前言 一.四种方式实现多线程 1.继承Thread类创建线程 2.实现Runnable接口创建线程 3.实现Callable接口 4.实现有返回结果的线程 二.多线程相关知识 1.Runnable 和 Callable 的区别 2.如何启动一个新线程.调用 start 和 run 方法的区别 3.线程相关的基本方法 4.wait()和 sleep()的区别 5.多线程原理 前言 Java多线程实现方式主要有四种: ① 继承Thread类.实现Runnable接口 ② 实现Callable接

随机推荐