1.MapStruct简介

MapStruct是一个代码生成器,它基于约定优于配置的方法,极大地简化了Java bean类型之间映射的实现。生成的映射代码使用简单的方法调用,快速、类型安全且易于理解。应用程序通常需要在不同的对象模型(例如实体和dto、vo)之间进行映射。编写这样的映射代码是一项繁琐且容易出错的任务。MapStruct是通过尽可能地自动化来简化这项工作。与其他映射框架相比,MapStruct在编译时使用原生代码处理,这确保了使用的高性能,同时支持复杂场景使用。出问题时可以快速的错误检查。

2.转换常用方案

fastjson

这种方案因为通过生成中间json格式字符串,然后再转化成目标对象,性能非常差,同时因为中间会生成json格式字符串,如果转化过多,
gc会非常频繁,同时针对复杂场景支持能力不足。

BeanUtil类

只能适合bean数量较少、内容不多、转换不频繁的场景。

apache.BeanUtils

用到反射的原因,同时本身设计问题,性能较差。

spring.BeanUtils(本人经常使用该工具)

spring的BeanUtils做了很多优化,整体性能提升不少,不过还是使用反射实现比不上原生代码处理,其次针对复杂场景支持能力不足。

beanCopier

BeanCopier copier = BeanCopier.create(DO.class, DTO.class, false);
copier.copy(do, dto, null);
整体性能接近原生代码处理,比BeanUtils要好很多,尤其在数据量很大时,但是针对复杂场景支持能力不足。

3.MapStruct依赖

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

4.MapStruct使用

创建接口添加@Mapper()注解

@Mapper(componentModel = "spring",
collectionMappingStrategy = CollectionMappingStrategy.ADDER_PREFERRED,
unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface TestTransfer {
Test add(Test.Add add); Test update(Test.Update update,@MappingTarget Test test); @Mapping(target = "titles",source = "title")
@Mapping(target = "contexts",source = "context")
Test.TestVo vo(Test test); @Mappings({
@Mapping(target = "title",source = "name"),
@Mapping(target = "context",source = "text")
})
Test query(Test.Query query);
}

调用

 private final TestTransfer testTransfer;
Test.Add add=Test.Add.builder().title("测试MapStruct").context("测试内容").status("启动").onLine("在线")
.build();
Test test = testTransfer.add(add);
//System.out.println(JSONObject.toJSONString(test));
Test update = testTransfer.update(Test.Update.builder().title("修改测试").build(),test);
// System.out.println(JSONObject.toJSONString(update));
Test.TestVo testVo = testTransfer.vo(test);
// System.out.println(JSONObject.toJSONString(testVo));
Test query = testTransfer.query(Test.Query.builder().name("aaaa").text("测试").build());
//System.out.println(JSONObject.toJSONString(query));

@org.mapstruct.Mapper注解相关属性

componentModel 属性

指定自动生成的接口实现类的组件类型。这个属性支持四个值:
default: 这是默认的情况,mapstruct不使用任何组件类型, 可以通过Mappers.getMapper(Class)方式获取自动生成的实例对象。
cdi: the generated mapper is an application-scoped CDI bean and can be retrieved via @Inject
spring: 生成的实现类上面会自动添加一个@Component注解,可以通过Spring的 @Autowired方式进行注入
jsr330: 生成的实现类上会添加@javax.inject.Named 和@Singleton注解,可以通过 @Inject注解获取。

collectionMappingStrategy属性

设置集合的映射策略 属性支持四个值:
ACCESSOR_ONLY 先getList在addAll
SETTER_PREFERRED 先清除目标集合clear(),再addAll(list)。
ADDER_PREFERRED 使用addList方法。
TARGET_IMMUTABLE 使用setList方法

unmappedTargetPolicy 属性

在未使用Mappin填充映射方法的target的属性的情况下默认报告策略
IGNORE 将被忽略
WARN 构建时引起警告
ERROR 映射代码生成失败

@MappingTarget 注解

需要更新的实体

MapStruct实体映射转换的更多相关文章

  1. Hibernate实体映射转换列值

    @Column(name="ADDTIME", insertable=false, updatable=false)@ColumnTransformer(read="CA ...

  2. 推荐一个 Java 实体映射工具 MapStruct

    声明: 1.DO(业务实体对象),DTO(数据传输对象). 2.我的代码中用到了 Lombok ,不了解的可以自行了解一下,了解的忽略这条就好. 在一个成熟的工程中,尤其是现在的分布式系统中,应用与应 ...

  3. Java实体映射工具MapStruct的使用

    官网地址:http://mapstruct.org/ MapStruct 是一个代码生成器,简化了不同的 Java Bean 之间映射的处理,所谓的映射指的就是从一个实体变化成一个实体.例如我们在实际 ...

  4. Asp.NetCore 3.1 使用AutoMapper自动映射转换实体 DTO,Data2ViewModel

    1:什么是AutoMapper? 下面为AutoMapper官方的解释: AutoMapper是一个对象-对象映射器.对象-对象映射通过将一种类型的输入对象转换为另一种类型的输出对象来工作. 使Aut ...

  5. EntityUtils MapStruct BeanCopier 数据实体类转换工具 DO BO VO DTO 附视频

    一.序言 在实际项目开发过程中,总有数据实体类互相转换的需求,DO.BO.VO.DTO等数据模型转换经常发生.今天推荐几个好用的实体类转换工具,分别是EntityUtils MapStruct Bea ...

  6. 开源实体映射框架EmitMapper介绍

    开源实体映射框架EmitMapper介绍   综述       EmitMapper是一个开源实体映射框架,地址:http://emitmapper.codeplex.com/.       Emit ...

  7. JdbcTemplate实体映射

    JdbcTemplate实体映射 如果你需要使用JdbcTemplate将查询的数据映射成Java POJO,那么这篇文章适合你. 一个例子入门 下面是一个将表中一行记录映射成Map的例子,也是Jdb ...

  8. 释怀我的诺亚尔 不用EF框架,完成完美实体映射,且便于维护!(AutoMapper,petapoco)

    释怀我的诺亚尔   不用EF框架,完成完美实体映射,且便于维护!(AutoMapper,petapoco) 最近,需要搭建一个新项目,在需求分析时确定数据库中需要创建多个存储过程.所以如果还是用原来E ...

  9. 在 ASP.NET Core 项目中使用 AutoMapper 进行实体映射

    一.前言 在实际项目开发过程中,我们使用到的各种 ORM 组件都可以很便捷的将我们获取到的数据绑定到对应的 List<T> 集合中,因为我们最终想要在页面上展示的数据与数据库实体类之间可能 ...

  10. ASP.NET Core Web 应用程序系列(五)- 在ASP.NET Core中使用AutoMapper进行实体映射

    本章主要简单介绍下在ASP.NET Core中如何使用AutoMapper进行实体映射.在正式进入主题之前我们来看下几个概念: 1.数据库持久化对象PO(Persistent Object):顾名思义 ...

随机推荐

  1. 微信小程序 图片预览 wx.previewImage

    官网地址: go官网 效果展示: list: [ 'http://img5.imgtn.bdimg.com/it/u=3300305952,1328708913&fm=26&gp=0. ...

  2. java.Text.ParseException:Unparseable date:"undefined 00:00:00"

    request.getParameter() 获取的日期要toString一下再parse,否则就会报这个异常

  3. redis为什么是单核单线程

    1)以前一直有个误区,以为:高性能服务器 一定是多线程来实现的 原因很简单因为误区二导致的:多线程 一定比 单线程 效率高,其实不然! 在说这个事前希望大家都能对 CPU . 内存 . 硬盘的速度都有 ...

  4. 【前端工程化】使用Nexus 搭建前端 npm 私服

    参考文献1 - https://blog.51cto.com/lookingdream/3609619 参考文献2 - https://blog.csdn.net/u013278374/article ...

  5. Error parsing HTTP request header 控制台报错分析与解决

    控制台报错信息: org.apache.coyote.http11.AbstractHttp11Processor process 信息: Error parsing HTTP request hea ...

  6. 记录Nginx配置

    1 # Proxy to the Airsonic server location / { proxy_set_header X-Real-IP $remote_addr; proxy_set_hea ...

  7. c# 递归应用 完成js文件自动引用

    背景: 两张表,分别是 :sys_tbl,和 sys_field,其中:sys_tbl 是系统所有表的信息,包含两个字段 :code(表名),name(表描述信息):sys_fld 是记录第张表中的字 ...

  8. 马志强:语音识别技术研究进展和应用落地分享丨RTC Dev Meetup

    本文内容源自「RTC Dev Meetup 丨语音处理在实时互动领域的技术实践和应用]的演讲分享,分享讲师为寰语科技语音识别研究主管马志强. 01 语音识别技术现状 1.语音成为万物互联时代人机交互关 ...

  9. Maven常用依赖包简单

    Maven官方仓库:Maven Repository: junit » junit (mvnrepository.com) Mysql 1 <!--Mysql--> 2 <depen ...

  10. MySQL 中索引是如何实现的,有哪些类型的索引,如何进行优化索引

    MySQL 中的索引 前言 索引的实现 哈希索引 全文索引 B+ 树索引 索引的分类 聚簇索引(clustered index) 非聚簇索引(non-clustered index) 联合索引 覆盖索 ...