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):顾名思义 ...
随机推荐
- go语言读取文件的简单使用
注意:打开文件记得一定要关闭 file, err := os.Open("文件名称") defer file.Close() 一.打开文件 1. file, err := os.O ...
- ABP vNext微服务架构详细教程(补充篇)——单层模板
1. 简介 在之前的<ABP vNext微服务架构详细教程>系列中,我们已经构建了完整的微服务架构实例,但是在开发过程中,我们会发现每个基础服务都包含10个类库,这是给予DDD四层架构下A ...
- kg打怪升级
1.kaggle notebook容易断[continue部署] 2.换预训练模型[提交试试] 3.换fold次数
- 不同页面的 body设置
由于SPA页面的特性,传统的设置 body 背景色的方法并不通用. 解决方案:利用组件内的路由实现 第一种方式 // 实例创建之前 beforeCreate(){ document.querySele ...
- Navicat 连接MySQL数据库 报错2059
Navicat 连接MySQL数据库 报错2059 - authentication plugin 'caching_sha2_password'的解决办法 2059 - Authentication ...
- python print 一个进度条
import time scale=100 print("执行开始".center(scale+28,'-')) start = time.perf_counter() for i ...
- vue3 ThreeJS 引入obj模型过暗的问题
当我单纯地用MTLLoader引入材质, OBJLoader引入模型并添加到场景中时, 发现模型非常得暗. 需要将环境光的强度设置到3.5左右看起来才比较正常. 但正常情况下环境光的值不应该超出1. ...
- Repeater 绑定数据如何根据数据列的内容排序
可指定Repeater的数据源 从数据库查询时直接排序,而后绑定数据这样
- day2Java程序基础
Java程序基础 Java程序基本结构 一个程序的基本单位是class,class是关键字 类名要求: 类名必须以英文字母开头,后接字母,数字和下划线的组合 习惯以大写字母开头 public除了修饰类 ...
- 【打怪升级】【rocketMq】rocket的持久化
rocket持久化保证的思想有两点:1是刷盘保证大部分数据不丢失:2是持久化文件的处理,零拷贝技术和内存页,NIO模型保证处理能力 文件持久化目录 ├──abort:rocket broker启动检查 ...