MapStruct 入门
介绍(What?Why?How?)
What?
MapStruct is a code generator that greatly simplifies the implementation of mappings between Java bean types based on a convention over configuration approach.
The generated mapping code uses plain method invocations and thus is fast, type-safe and easy to understand.
MapStruct是一个代码生成器,它极大地简化了Javabean类型之间的映射的实现,这是一种基于约定而非配置的方法。生成的映射代码使用简单的方法调用,因此快速、类型安全且易于理解。
Why?
Multi-layered applications often require to map between different object models (e.g. entities and DTOs). Writing such mapping code is a tedious and error-prone task. MapStruct aims at simplifying this work by automating it as much as possible.
In contrast to other mapping frameworks MapStruct generates bean mappings at compile-time which ensures a high performance, allows for fast developer feedback and thorough error checking.
多层应用程序通常需要在不同的对象模型(例如实体和DTO)之间进行映射。编写这样的映射代码是一项乏味且容易出错的任务。MapStruct旨在通过尽可能自动化来简化这项工作。与其他映射框架不同,MapStruct在编译时生成bean映射,这确保了高性能,允许快速的开发人员反馈和彻底的错误检查
How?
MapStruct is an annotation processor which is plugged into the Java compiler and can be used in command-line builds (Maven, Gradle etc.) as well as from within your preferred IDE.
MapStruct uses sensible defaults but steps out of your way when it comes to configuring or implementing special behavior.
MapStruct是一个插入Java编译器的注释处理器,可以在命令行构建(Maven、Gradle等)中使用,也可以在您首选的IDE中使用。MapStruct使用合理的默认值,但在配置或实现特殊行为时,它会避开您。
总结,简而言之就是这功能,Bean copy:
BeanUtils.copyProperties(userDO,userDTO);
怎么用
- 引入依赖
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.4.2.Final</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.4.2.Final</version>
</dependency>
- User与UserQueryParm
@Data
public class User {
String sno;
String username;
String isDelete;
}
@Data
public class UserQueryParam {
String sno;
String name;
}
- 编写接口
@Mapper
public interface UserMapper {
UserMapper INSTANCE = Mappers.getMapper(UserMapper.class);
// User 与 UserQueryParam 字段不一致时映射
@Mapping(source = "username",target = "name")
UserQueryParam entity2queryParam(User user);
}
- 使用
public class MapstructApplication {
public static void main(String[] args) {
User user = new User();
user.setSno("20231212");
user.setUsername("xiaozhang");
List<UserQueryParam> collect = Arrays.asList(user).stream()
.map(UserMapper.INSTANCE::entity2queryParam)
.collect(Collectors.toList());
for (UserQueryParam userQueryParam : collect) {
System.out.println(JSONUtil.toJsonStr(userQueryParam));//{"sno":"20231212","name":"xiaozhang"}
}
}
}
答疑解惑
为什么不用BeanUtils.copyProperties(userDO,userDTO)?
当转换的对象是列表时,MapperStruct的优雅才得以展现。MapStruct在编译时生成bean映射?

编译时产生,安全性更高,编译不通过,则会运行失败。使用mapstruct.Mapper 转换对象属性为null ?
lombok依赖和mapstruct依赖顺序问题,将lombok放前边。
参考链接:https://blog.csdn.net/qq_41169544/article/details/127675917
参考
官网:https://mapstruct.org/
ABin-阿斌:https://blog.csdn.net/Mango_Bin/article/details/125168370
MapStruct 入门的更多相关文章
- 高效、优雅的对象copy之MapStruct入门到精通,实战踩坑版
一.前言 大家在开发中,最让人头疼的就是:对象之间的拷贝,前端的VO和数据库的Entity不一致! 性能最好的就是手动set,主要是枯燥且无技术含量,不仅耗费大量时间而且很容易出错: 所以我们要成为优 ...
- 优雅的对象转换解决方案-MapStruct及其入门(一)
第一次看到 MapStruct 的时候, 我个人非常的开心. 因为其跟我内心里面的想法不谋而合. 1 MapStruct 是什么? 1.1 JavaBean 的困扰 对于代码中 JavaBean之间的 ...
- 常用开发库 - 告別BeanUtils拷贝,MapStruct工具库最全详解
常用开发库 - MapStruct工具库详解 MapStruct是一款非常实用Java工具,主要用于解决对象之间的拷贝问题,比如PO/DTO/VO/QueryParam之间的转换问题.区别于BeanU ...
- 常用开发库 - MapStruct工具库详解
常用开发库 - MapStruct工具库详解 MapStruct是一款非常实用Java工具,主要用于解决对象之间的拷贝问题,比如PO/DTO/VO/QueryParam之间的转换问题.区别于BeanU ...
- MapStruct对象转换
第一次看到 MapStruct 的时候, 我个人非常的开心.因为其跟我内心里面的想法不谋而合. 1 MapStruct 是什么? 1.1 JavaBean 的困扰 对于代码中 JavaBean之间的转 ...
- spring boot 之使用mapstruct
最近在阅读swagger源码,当看到 springfox.documentation.swagger2.mappers.ModelMapper 类时,无意中看到该类上面使用的 org.mapstruc ...
- 优雅的对象转换解决方案-MapStruct使用进阶(二)
在前面, 介绍了 MapStruct 及其入门. 本文则是进一步的进阶. 在 MapStruct 生成对应的实现类的时候, 有如下的几个情景. 1 属性名称相同,则进行转化 在实现类的时候, 如果属性 ...
- Angular2入门系列教程7-HTTP(一)-使用Angular2自带的http进行网络请求
上一篇:Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数 感觉这篇不是很好写,因为涉及到网络请求,如果采用真实的网络请求,这个例子大家拿到手估计还要自己写一个web ...
- ABP入门系列(1)——学习Abp框架之实操演练
作为.Net工地搬砖长工一名,一直致力于挖坑(Bug)填坑(Debug),但技术却不见长进.也曾热情于新技术的学习,憧憬过成为技术大拿.从前端到后端,从bootstrap到javascript,从py ...
- Oracle分析函数入门
一.Oracle分析函数入门 分析函数是什么?分析函数是Oracle专门用于解决复杂报表统计需求的功能强大的函数,它可以在数据中进行分组然后计算基于组的某种统计值,并且每一组的每一行都可以返回一个统计 ...
随机推荐
- WiFi基础(三):802.11ac/ax/be 与 WiFi4、WiFi5、WiFi6、WiFi7
liwen01 2024.09.08 前言 经过二十多年的发展,WiFi 在硬件能力.软件和算法.频谱资源.市场需求.电源与能效方面都有了很大的提升.所以我们能看到从最开始只有几 M 速率的 802. ...
- vue单元测试
0.测试钩子函数 describe的钩子函数 在测试块describe中,存在这四个钩子函数,他会在describe执行的不同时期调用: before():在该区块的所有测试用例之前执行 after( ...
- webpack笔记-webpack之模块module、路径解析、resolve 配置(三)
module webpack 的初衷是让 js 支持模块化管理,并且将前端中的各种资源都纳入到对应的模块管理中来,所以在 webpack 的设计中,最重要的部分就是管理模块和模块之间的关系. 在 we ...
- Windows 调试工具课程
本文是我在集团内部上的课程记录而成的博客内容.在本次课程里面将和大家介绍一些在 Windows 上常用的调试工具,以及调查问题的常见套路.适合于伙伴们入门 Windows 调试 本文以下内容是采用原本 ...
- MyBatis——案例——查询-多条件查询-动态条件查询(关键字 if where)
动态条件查询 SQL语句会随着用户的输入或外部条件的变化而变化,我们称为 动态SQL MyBatis 对动态SQL有很强大的支撑: if choose(when,otherwise) ...
- meminfo一些容易混淆的点
MemTotal: 688576 kB 总内存 MemFree: 153736 kB 空闲内存 MemAvailable: 339884 kB 可用内存 Buffers: 16 kB 给文件的缓冲大小 ...
- ChallengeMobile
解题思路 获取到输入的字符串保存到s,调用Jformat方法对s进行验证,返回true则代表输入字符串正确反之错误. Jformat方法分析: 首先看到使用了LoadData加载了"ming ...
- HDU-ACM 2024 Day2
T1004 a*b problem(HDU 7448) 不会. T1005 小塔的养成游戏之梦(HDU 7449) 不会. T1009 强攻计策(HDU 7453) 容易发现初始速度是多少对答案没有影 ...
- 安装gd库出错
最近手痒,就安装了一个centos 6.5玩玩. 由于新的centos的当前版本已经达到7.1. 而且最糟的是在本人不小心的时候在安装软件的时候, 确定里里面的更新系统命令,导致版本变为了6.9. 然 ...
- Visual Studio 2022只能使用WSL调试问题处理
删除项目的Properties目录下面的launchSettings.json文件