MapStruct实体映射转换
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实体映射转换的更多相关文章
- Hibernate实体映射转换列值
@Column(name="ADDTIME", insertable=false, updatable=false)@ColumnTransformer(read="CA ...
- 推荐一个 Java 实体映射工具 MapStruct
声明: 1.DO(业务实体对象),DTO(数据传输对象). 2.我的代码中用到了 Lombok ,不了解的可以自行了解一下,了解的忽略这条就好. 在一个成熟的工程中,尤其是现在的分布式系统中,应用与应 ...
- Java实体映射工具MapStruct的使用
官网地址:http://mapstruct.org/ MapStruct 是一个代码生成器,简化了不同的 Java Bean 之间映射的处理,所谓的映射指的就是从一个实体变化成一个实体.例如我们在实际 ...
- Asp.NetCore 3.1 使用AutoMapper自动映射转换实体 DTO,Data2ViewModel
1:什么是AutoMapper? 下面为AutoMapper官方的解释: AutoMapper是一个对象-对象映射器.对象-对象映射通过将一种类型的输入对象转换为另一种类型的输出对象来工作. 使Aut ...
- EntityUtils MapStruct BeanCopier 数据实体类转换工具 DO BO VO DTO 附视频
一.序言 在实际项目开发过程中,总有数据实体类互相转换的需求,DO.BO.VO.DTO等数据模型转换经常发生.今天推荐几个好用的实体类转换工具,分别是EntityUtils MapStruct Bea ...
- 开源实体映射框架EmitMapper介绍
开源实体映射框架EmitMapper介绍 综述 EmitMapper是一个开源实体映射框架,地址:http://emitmapper.codeplex.com/. Emit ...
- JdbcTemplate实体映射
JdbcTemplate实体映射 如果你需要使用JdbcTemplate将查询的数据映射成Java POJO,那么这篇文章适合你. 一个例子入门 下面是一个将表中一行记录映射成Map的例子,也是Jdb ...
- 释怀我的诺亚尔 不用EF框架,完成完美实体映射,且便于维护!(AutoMapper,petapoco)
释怀我的诺亚尔 不用EF框架,完成完美实体映射,且便于维护!(AutoMapper,petapoco) 最近,需要搭建一个新项目,在需求分析时确定数据库中需要创建多个存储过程.所以如果还是用原来E ...
- 在 ASP.NET Core 项目中使用 AutoMapper 进行实体映射
一.前言 在实际项目开发过程中,我们使用到的各种 ORM 组件都可以很便捷的将我们获取到的数据绑定到对应的 List<T> 集合中,因为我们最终想要在页面上展示的数据与数据库实体类之间可能 ...
- ASP.NET Core Web 应用程序系列(五)- 在ASP.NET Core中使用AutoMapper进行实体映射
本章主要简单介绍下在ASP.NET Core中如何使用AutoMapper进行实体映射.在正式进入主题之前我们来看下几个概念: 1.数据库持久化对象PO(Persistent Object):顾名思义 ...
随机推荐
- 重复引入reactor-netty
java.lang.NoClassDefFoundError: reactor/util/retry/Retry at reactor.netty.http.client.HttpClientConn ...
- Eclipse's Import error and remove
1.导入项目之前,请确认工作空间编码已设置为utf-8:window->Preferences->General->Wrokspace->Text file encoding- ...
- spring下的restTemplate使用
首先上配置,由于restTemplate不支持一些返回格式,所以需要自己手动配置 /** * @Description : restTemplate配置类 * @Author : wzkris * @ ...
- redis基础-redis事务
学习总结 原文:https://juejin.im/post/5d29ac845188252cc75e2d5c redis事务: redis是否有事务? redis是有事务的.命令如下: Redis事 ...
- mysql使用support-files下的mysql.server启动报错“Starting MySQL ERROR! Couldn't find MySQL server (/usr/local/mysql/bin/mysqld_safe)”
报错版本:mysql-5.7.35 1.报错完整提示信息: [root@localhost support-files]# ./mysql.server start ./mysql.server: l ...
- Vue 的下拉刷新指令
loadmore: { //自定义指令: 下拉加载 bind(el, binding) { let p = 0; let t = 0; let down = true; el.addEventList ...
- app工程目录结构
一.APP工程目录结构 APP工程分为两个层次,第一个层次是项目(这里在eclipse中是指workspace),另一个层次是模块(这里在eclipse中是指project) 模块依附于项目,每个项目 ...
- keras图片数字识别入门AI机器学习
通过使用mnist(AI界的helloworld)手写数字模型训练集,了解下AI工作的基本流程. 本例子,要基于mnist数据集(该数据集包含了[0-9]的模型训练数据集和测试数据集)来完成一个手写数 ...
- Nacos的微服务与本地测试的问题
前提条件: 这里是微服务上的yml的配置: uri: base-svc-authcenter: 192.168.1.121:28002 base-svc-file: 192.168.1.121:280 ...
- 加密脚本分析—evil.py
加密脚本分析-evil.py 1.题目 源文件 一共两个文件 enc_flag.txt evil.py(原文件无注释) 1 # coding: utf-8 2 3 import base64 4 im ...