Skip to main content

moregeek program

entityutils mapstruct beancopier 数据实体类转换工具 do bo vo dto 附视频_赛先生和泰先生的博客-多极客编程

一、序言


在实际项目开发过程中,总有数据实体类互相转换的需求,DO、BO、VO、DTO等数据模型转换经常发生。今天推荐几个好用的实体类转换工具,分别是EntityUtils MapStruct BeanCopier ,并且给出使用的案例。需要说明的是,本文有配套视频讲解。


下面分别讲解这3种工具的使用。


二、实战编码


(一)EntityUtils


1、引入依赖

学习工具包源代码的朋友,请看这里


<!--EntityUtils工具类包-->
<dependency>
<groupId>xin.altitude.cms</groupId>
<artifactId>ucode-cms-common</artifactId>
<version>1.5.8</version>
</dependency>

2、DO

@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName(value = "tb_user")
public class User {
private static final long serialVersionUID = 1L;
@TableId(type = IdType.AUTO)
private Long userId;
private String userName;
private Integer age;
private Long deptId;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime gmtCreate;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime gmtModified;

public User(User user) {
if (Objects.nonNull(user)) {
this.userId = user.userId;
this.userName = user.userName;
this.age = user.age;
this.deptId = user.deptId;
this.gmtCreate = user.gmtCreate;
this.gmtModified = user.gmtModified;
}
}
}

3、VO

@Data
@NoArgsConstructor
public class UserVo extends User {
private String deptName;
private String tel;

/**
* 原生构造器来实现 DO 转 VO
*
* @param user
*/
public UserVo(User user) {
super(user);
}
}

4、转换

public List<UserVo> selectUserList1() {
List<User> userList = this.list();
// 一行代码完成实体类转换
List<UserVo> userVoList = EntityUtils.toList(userList, UserVo::new);
return userVoList;
}

说明一下,使用EntityUtils工具类最主要的是处理DO、VO等数据类构造器。


(二)MapStruct


1、引入依赖

<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.5.3.Final</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.5.3.Final</version>
</dependency>

2、DO和VO

@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName(value = "tb_user")
public class User {
private static final long serialVersionUID = 1L;
@TableId(type = IdType.AUTO)
private Long userId;
private String userName;
private Integer age;
private Long deptId;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime gmtCreate;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime gmtModified;
}

@Data
@NoArgsConstructor
public class UserVo extends User {
private String deptName;
private String tel;
}

3、MapStruct文件

@org.mapstruct.Mapper
public interface UserMapStrcut {
UserVo toUserVo(User user);
List<UserVo> toUserVo(List<User> user);
}

4、转换

public List<UserVo> selectUserList2() {
List<User> userList = this.list();
UserMapStrcut mapper = Mappers.getMapper(UserMapStrcut.class);
return mapper.toUserVo(userList);
}

(三)BeanCopier


BeanCopier在Spring体系下无额外依赖,DO和VO数据类同MapStruct部分。


转换

public List<UserVo> selectUserList3() {
List<User> userList = this.list();
BeanCopier beanCopier = BeanCopier.create(User.class, UserVo.class, false);
List<UserVo> rs = new ArrayList<>();
for (User user : userList) {
UserVo userVo = new UserVo();
beanCopier.copy(user, userVo, null);
rs.add(userVo);
}
return rs;
}

三、小结


本文介绍的三种实体类转换工具是非常高效的,相比于以反射为基础的实现来说,性能相当出色。数据模型这块在程序运行过程中会创建大量对象,因此既要考虑开发的灵活性,也要注重运行性能。


©著作权归作者所有:来自51CTO博客作者赛先生和泰先生的原创作品,请联系作者获取转载授权,否则将追究法律责任

谈云服务,那不得不谈这个技术_周杰伦本人的博客-多极客编程

谈云服务,那不得不谈这个技术 坚持原创,写好每一篇文章 上篇文章我们说到docker的出现让容器即服务变成了可能并日趋流行,然而docker部署的服务越来越多以后,容器的管理就成为了问题,kubernetes就是用来解决这个问题的。如果没有kubernetes,我相信,容器肯定混乱不堪,并且难以维护。kubernetes可以实现容器的自动部署,自动扩缩容和管理容器。所以如果要谈云服务的,kub

一文带你吃透java中的继承_mb6353c9b8a50b6的博客-多极客编程

继承 继承的概念 面向对象的三大特征:封装性、继承性、多态性。 继承是多态的前提,如果没有继承,就没有多态。 继承关系当中的特点: 1.子类可以拥有父类的“内容”。 2.子类还可以拥有自己的专有内容。 父类也可以叫基类、超类 。 子类也可以叫派生类。 继承的格式 在继承的关系中,“子类就是一个父类”。也就是说,子类可以被当做父类看待。 定义父类的格式:(一个普通的类定义) pub

apache solr 的 spring data (数据)_spring认证的博客-多极客编程

版本 4.3.15Spring Data for Apache Solr项目通过使用Apache Solr搜索引擎将Spring的核心概念应用于解决方案的开发。我们提供了一个“模板”作为存储和查询文档的高级抽象。您可能会注意到与Spring Framework中的MongoDB支持相似之处。项目元数据版本控制:https://github.com/spring-projects/spring-da

聊一聊装饰者模式_知了一笑的博客-多极客编程

是你,还是你,一切都有你!—— 装饰者模式 一、概述 装饰者模式(Decorator Pattern)允许向一个现有的对象扩展新的功能,同时不改变其结构。主要解决直接继承下因功能的不断横向扩展导致子类膨胀的问题,无需考虑子类的维护。 装饰者模式有4种角色: 抽象构件角色(Component):具体构件类和抽象装饰者类的共同父类。 具体构件角色(ConcreteComponent):抽象构件的

常见的关于堆栈以及list集合的考察方面_浅羽技术的博客-多极客编程

堆和栈的区别  堆内存用来存放由new创建的对象和数组,通过new关键字和构造器创建的对象放在堆空间,大量的对象都是放在堆空间,整个内存包括硬盘上的虚拟内存都可以被当成堆空间来使用 栈里面存放的是所有基本数据类型和引用数据类型,我们定义一个基本数据类型的变量,一个对象的引用,还有就是函数调用的现场保存都使用内存中的栈空间,栈空间操作最快但是也很小 arrayList和linkedList的区别 我

#yyds干货盘点# leetcode 腾讯精选练习 50 题:nim 游戏_灰太狼_cxh的博客-多极客编程

题目:你和你的朋友,两个人一起玩 Nim 游戏:桌子上有一堆石头。你们轮流进行自己的回合, 你作为先手 。每一回合,轮到的人拿掉 1 - 3 块石头。拿掉最后一块石头的人就是获胜者。假设你们每一步都是最优解。请编写一个函数,来判断你是否可以在给定石头数量为 n 的情况下赢得游戏。如果可以赢,返回 true;否则,返回 false 。 示例 1:输入:n = 4输出:false 解释:以下是可能的结

[oeasy]python0019_ 打包和解包_struct_pack_unpack_overmind1980的博客-多极客编程

打包和解包回忆上次内容ASCII 由这样几类字符构成英文大写字符英文小写字符数字符号电报时代对于英文、数字的编码使用的是摩斯电码这摩斯电码是3进制的编码方式 长短空怎么演化成ascii这种0101的二进制编码的呢?🤔回到 ASCII 码电报传过来的信号需要记录下来 于是有了电传打字机(tele-typewriter)电传打字机需要统一的编码字母和数字ASCII的第一个商业用途 是作为一个七位电传打

harmonyos arkts 本地库&三方库的用法_鸿蒙社区的博客-多极客编程

项目介绍 项目内容: 自定义基础组件和容器组件、依赖库概念、本地依赖库的创建和引用、三方库的引用。 工具版本: DevEco Studio 3.1 Canary1 SDK版本: 3.2.1.4(API Version 9 Canary1)(Stage模型) 本项目基于HarmonyOS的ArkUI框架TS扩展的声明式开发范式,关于语法和概念直接看官网官方文档地址:基于TS扩展的声明式开发范式, 效

谈云服务,那不得不谈这个技术_周杰伦本人的博客-多极客编程

谈云服务,那不得不谈这个技术 坚持原创,写好每一篇文章 上篇文章我们说到docker的出现让容器即服务变成了可能并日趋流行,然而docker部署的服务越来越多以后,容器的管理就成为了问题,kubernetes就是用来解决这个问题的。如果没有kubernetes,我相信,容器肯定混乱不堪,并且难以维护。kubernetes可以实现容器的自动部署,自动扩缩容和管理容器。所以如果要谈云服务的,kub

聊一聊装饰者模式_知了一笑的博客-多极客编程

是你,还是你,一切都有你!—— 装饰者模式 一、概述 装饰者模式(Decorator Pattern)允许向一个现有的对象扩展新的功能,同时不改变其结构。主要解决直接继承下因功能的不断横向扩展导致子类膨胀的问题,无需考虑子类的维护。 装饰者模式有4种角色: 抽象构件角色(Component):具体构件类和抽象装饰者类的共同父类。 具体构件角色(ConcreteComponent):抽象构件的

matlab simulink常见问题和数据导出到变量区_domi+1的博客-多极客编程

✅作者简介:热爱科研的算法开发者,Python、Matlab项目可交流、沟通、学习。 🍎个人主页:算法工程师的学习日志1、simulink常见问题问题1:scope波形图没有或者看不清解决方案:你要使图像自适应,点击scope里面的这个按钮问题2:运行代码出现下面提示框解决方案:这是系统提示你的文件不在matlab的根目录下面。这个为matlab的根目录。你要把对应的代码、模型之类的文件放在这个文

常见的关于堆栈以及list集合的考察方面_浅羽技术的博客-多极客编程

堆和栈的区别  堆内存用来存放由new创建的对象和数组,通过new关键字和构造器创建的对象放在堆空间,大量的对象都是放在堆空间,整个内存包括硬盘上的虚拟内存都可以被当成堆空间来使用 栈里面存放的是所有基本数据类型和引用数据类型,我们定义一个基本数据类型的变量,一个对象的引用,还有就是函数调用的现场保存都使用内存中的栈空间,栈空间操作最快但是也很小 arrayList和linkedList的区别 我