本文聊一个工具类,MapStruct ,它是一个在 dto,po(do/entity),vo 等这些 pojo 中转换字段的一个工具,在应用中经常有这样的转换,在 spring 和 apache-commons 中也有 BeanUtils 复制,但不够灵活,我之前也用反射写过一个字段复制,这种复制一般来是是很大量的,用反射会使系统的性能降低,有一种更高效的办法就是使用字节码工具类生成这些代码,这时在编译期就把代码弄好了,并且出错也好调试。

除了 MapStruct ,类似的工具还有

  • Spring 的 BeanUtils ,apachecommons 的 BeanUtils
  • Dozer - Mapper that copies data from one object to another using annotations and API or XML configuration.
  • JMapper - Uses byte code manipulation for lightning-fast mapping. Supports annotations and API or XML configuration.
  • ModelMapper - Intelligent object mapping library that automatically maps objects to each other.
  • Orika - JavaBean-mapping framework that recursively copies (among other capabilities) data from one object to another.
  • Selma - Annotation processor-based bean mapper.

我们的实际需求一般长这样子

  • 同名字段同类型需要直接复制,不同类型要能转换
  • 不同字段名同含义需要能转换
  • 有时候需要有一些字段是不能复制的,比如 id
  • 合并两个对象成一个对象,或者使用一个对象更新一个对象
  • 性能要高,因为这个量比较大

所以首先就排除 spring 和 apache 的 BeanUtils 了,它们使用反射,并且不能排除字段,而且不同名不能复制,同名同类型还出错,超级难用

然后就是下面几种框架的性能对比 ,对比详情见 这篇文章

从性能>易用性>易调试>流行度 来说,我选择使用 Mapstruct

MapStruct 使用方法

MapStruct 使用起来也是比较简单的,引入两个包,加个接口转换,由于它是字节码转换方式,会自动给你生成字节码,你也可以直接查看的,使用方式网上文章很多,这里随便贴一篇

MapStruct 工具包的使用 更多使用细节自行百度或查官网 MapStruct 官网

MapStruct 原理

MapStruct 使用了 SPI 形式加载处理注解的类 MappingProcessor ,关于 SPI 见 这篇文章

ServiceLoader 的源码也不复杂,就是我们熟知的 Class.forName 搞的,感觉没多少原理可讲

然后给接口使用字节码工具类生成实现类,然后实现类里面就是各种判空和 get set

可以配合 lombok 生成 get set ,基本上重复代码都让编译器去写了。

文尾:最初我也是不太喜欢这种形式,看到注解都盖楼了,但用了一下之后发现,真香

一点小推广

创作不易,希望可以支持下我的开源软件,及我的小工具,欢迎来 gitee 点星,fork ,提 bug 。

Excel 通用导入导出,支持 Excel 公式
博客地址:https://blog.csdn.net/sanri1993/article/details/100601578
gitee:https://gitee.com/sanri/sanri-excel-poi

使用模板代码 ,从数据库生成代码 ,及一些项目中经常可以用到的小工具
博客地址:https://blog.csdn.net/sanri1993/article/details/98664034
gitee:https://gitee.com/sanri/sanri-tools-maven

Bean 字段复制利器 MapStruct的更多相关文章

  1. Bean属性复制,字段名可不同,字段类型不同需要自行处理

    @Setter @Getter public class SourceA { private String name; private String text; public SourceA(Stri ...

  2. 属性复制神器-mapstruct

    我们之前说到项目中会用到各种object,vo,bo,dto等等.我们需要在不同的对象上复制属性. 一.BeanUtils和PropertyUtils 我们最常用的就是Common包里面的BeanUt ...

  3. spring data jpa自定义bean字段映射

    当遇到复杂多表查询时,并且同时还需要确保查询性能,此时则需要使用自定义sql查询,然而spring data jpa对于自定义sql则需使用查询需要在对应的bean中做太多的配置映射,我尝试了一下,最 ...

  4. (spring-第13回【IoC基础篇】)PropertyEditor(属性编辑器)--实例化Bean的第五大利器

    上一篇讲到JavaBeans的属性编辑器,编写自己的属性编辑器,需要继承PropertyEditorSupport,编写自己的BeanInfo,需要继承SimpleBeanInfo,然后在BeanIn ...

  5. bean属性复制到另外一个bean

    import org.springframework.beans.BeanUtils; BeanUtils.copyProperties(maker.getBaseInfo(), newBasInfo ...

  6. Spring AOP实现 Bean字段合法性校验

    使用SpringAop 验证方法参数是否合法   先定义两个注解类ValidateGroup 和 ValidateFiled ValidateGroup .java package com.zf.an ...

  7. C#DataTable复制、C#DataTable列复制、C#DataTable字段复制

    try { //获取满足条件的数据 DataTable Mdr = datable.Select().ToString("yyyy-MM-dd HH:mm:ss") + " ...

  8. java通过反射获取bean字段注解@Column中的信息

    直接上代码吧: Field field; Field[] fields=clas.getDeclaredFields(); for (int i = 0; i <fields.length ; ...

  9. mysql表复制和修改部分字段

    今天在工作中,需要造大量的加数据,1000多条数据如果都是手工输入的话,那么我今天不要干别的了,就造吧! 当时手工操作重复的事情,对程序员来说,是一件很丢人的事情,所以就上网查了一下,需要用到两个知识 ...

随机推荐

  1. [TCP/IP] 学习TCP/IP协议的笔记

    1.我看的视频是https://www.bilibili.com/video/av10610680?from=search&seid=1733008388243131444这位大大的视频讲解. ...

  2. nyoj 366 D的小L (全排列)

    D的小L 时间限制:4000 ms  |  内存限制:65535 KB 难度:2   描述       一天TC的匡匡找ACM的小L玩三国杀,但是这会小L忙着哩,不想和匡匡玩但又怕匡匡生气,这时小L给 ...

  3. 领扣(LeetCode)删除注释 个人题解

    给一个 C++ 程序,删除程序中的注释.这个程序source是一个数组,其中source[i]表示第i行源码. 这表示每行源码由\n分隔. 在 C++ 中有两种注释风格,行内注释和块注释. 字符串// ...

  4. Windows 10上源码编译glog和gflags 编写glog-config.cmake和gflags-config.cmake | compile glog and glags on windows from source

    本文首发于个人博客https://kezunlin.me/post/bb64e398/,欢迎阅读! compile glog v0.3.5 and glags on windows from sour ...

  5. Mac usr/bin 目录 权限问题

    Mac进行 usr/bin 目录下修改权限问题,operation not permitted 一般情况下我们在使用mac系统过程中下载一些文件.新建一些项目之后,这些文件都会默认是只读状态,这时我们 ...

  6. Cygwin安装教程

    cygwin是一个在windows平台上运行的unix模拟环境,是cygnus solutions公司开发的自由软件. 它对于学习unix/linux操作环境,或者从unix到windows的应用程序 ...

  7. java集合讲解

    java集合讲解 1.概述 集合类的顶级接口是Iterable,Collection继承了Iterable接口 常用的集合主要有 3 类,Set,List,Queue,他们都是接口,都继于Collec ...

  8. Css搭建

    教你做css比较好的网站: https://www.jianshu.com/p/23b2bfc9a90d?tdsourcetag=s_pcqq_aiomsg https://cloud.tencent ...

  9. Xamarin.Forms 学习系列之优秀UI收集

    1.各种优秀UI例子 https://github.com/jsuarezruiz/xamarin-forms-goodlooking-UI 输入框例子 https://github.com/enis ...

  10. docker配置mysql主从与django实现读写分离

    一.搭建主从mysql环境 1 下载mysql镜像 docker pull mysql:5.7 2 运行刚下载的mysql镜像文件 # 运行该命令之前可以使用`docker images`是否下载成功 ...