当前位置: 首页 > news >正文

MapStruct从0到0.5

MapStruct从0到0.5

开发的过程,经常会用到实体类属性映射,同时为了方便,开发者也很少自己写专门的属性赋值工具类。索性会直接使用Sprrng提供的BeanUtils工具类,然后在性能上和字段属性赋值上的问题,一直是为开发者所诟病的,下面直接上案例。

1、引入依赖

注意lombok引入一定要在mapstruct依赖的前面。否则会出现无法找到Setter和Getter方法的异常出现。

<dependencies><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!-- mapstruct --><dependency><groupId>org.mapstruct</groupId><artifactId>mapstruct-jdk8</artifactId><version>1.5.3.Final</version></dependency><dependency><groupId>org.mapstruct</groupId><artifactId>mapstruct-processor</artifactId><version>1.5.3.Final</version></dependency><dependency><groupId>org.mapstruct</groupId><artifactId>mapstruct</artifactId><version>1.5.3.Final</version></dependency>
</dependencies>

2、编写案例

引入依赖后,则进行日常较为常用的案例测试,首先附上基础代码:
User.java

@Data
public class User {private Long id;/*** 情况一:时间字符串转时间对象*/private String birthDay;/*** 时间字符串转时间对象*/private Date happenDay;/*** 情况二:使用工具类指定方法进行处理字段*/private String ids;/*** 情况三:忽略字段*/private String ignore;/*** 情况四:字段对应*/private String label;
}

UserVo.java

@Data
public class UserVo {private Long id;/*** 情况一:时间字符串转时间对象*/private Date birthDay;/*** 时间对象转时间字符串*/private String happenDay;/*** 情况二:使用工具类指定方法进行处理字段*/private List<String> ids;/*** 情况三:忽略字段*/private String ignore;/*** 情况四:字段对应*/private String value;
}

**注意:**这里的Mapper注解在mapstruct包下,别与myBatis中的注解混淆。

UserMapper.java

import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;@Mapper
public interface UserMapper {UserMapper INSTANCE = Mappers.getMapper(UserMapper.class);@Mapping(target = "birthDay", dateFormat = "yyyy-MM-dd")@Mapping(target = "happenDay", dateFormat = "yyyy-MM-dd")@Mapping(source = "label", target = "value")@Mapping(target = "ignore", ignore = true)@Mapping(target = "ids", expression = "java(ConverterUtil.strToList(user.getIds()))")UserVo UserToUserVo(User user);
}

ConverterUtil.java

public class ConverterUtil {public static List<String> strToList(String str){return Arrays.asList(str.split(","));}
}

MapStructTest.java

public class MapStructTest {public static void main(String[] args) {// 1、创造属性User user = new User();user.setId(1L);user.setBirthDay("2023-08-29");user.setHappenDay(new Date());user.setIds("11,22,33");user.setIgnore("这是一个忽略字段");user.setLabel("将label映射到value上");// 2、测试效果UserVo userVo = UserMapper.INSTANCE.UserToUserVo(user);System.out.println(userVo);}
}

下面打印显示结果:

UserVo(id=1, birthDay=Tue Aug 29 00:00:00 CST 2023, happenDay=2023-09-09, 
ids=[11, 22, 33], ignore=null, value=将label映射到value上)Process finished with exit code 0

3、详细说明

1、@Mapping和@Mappings
@Mapping(target = "birthDay", dateFormat = "yyyy-MM-dd")
@Mapping(target = "happenDay", dateFormat = "yyyy-MM-dd")
@Mapping(source = "label", target = "value")
@Mapping(target = "ignore", ignore = true)
@Mapping(target = "ids", expression = "java(ConverterUtil.strToList(user.getIds()))")
UserVo UserToUserVo(User user);

上文中多个Mapping也可以替换为Mapings写法

@Mappings({@Mapping(target = "birthDay", dateFormat = "yyyy-MM-dd"),@Mapping(target = "happenDay", dateFormat = "yyyy-MM-dd"),@Mapping(source = "label", target = "value"),@Mapping(target = "ignore", ignore = true),@Mapping(target = "ids", expression ="java(ConverterUtil.strToList(user.getIds()))")})
UserVo UserToUserVo(User user);
2、dateFormat 时间类型(Date.class)和字符串的相互转换

无论是时间字符串转时间对象,还是时间对象转时间字符串都需要补充转换的时间格式

// birthDay有 string 转 date
@Mapping(target = "birthDay", dateFormat = "yyyy-MM-dd")
// happenDay有 date 转 string
@Mapping(target = "happenDay", dateFormat = "yyyy-MM-dd")
3、ignore 字段忽略
// boolean ignore() default false;
@Mapping(target = "ignore", ignore = true)
4、编写Java方法表达式,使用自定义工具类进行字段值转变

ConverterUtil .class工具类

public class ConverterUtil {public static List<String> strToList(String str){return Arrays.asList(str.split(","));}
}

使用格式

@Mapping(target = "ids", expression = "java(ConverterUtil.strToList(user.getIds()))")
UserVo UserToUserVo(User user);
5、字段映射
// User的label  映射到 UserVo的value
@Mapping(source = "label", target = "value")
UserVo UserToUserVo(User user);
6、设置属性为常量或者默认值
// 设置常量
@Mapping(source = "id", target = "id", constant = "-1L")
UserVo UserToUserVo(User user);
// 设置默认值
@Mapping(source = "id", target = "id", defaultValue= "1024L")
UserVo UserToUserVo(User user);

4、后续

以上就是笔者目前在项目所用的一些记实,如果想了解更多,笔者找到一份比较详细的文章,用来参考
MapStruct之@Mapping注解的用法
官方文档

相关文章:

MapStruct从0到0.5

MapStruct从0到0.5 开发的过程&#xff0c;经常会用到实体类属性映射&#xff0c;同时为了方便&#xff0c;开发者也很少自己写专门的属性赋值工具类。索性会直接使用Sprrng提供的BeanUtils工具类&#xff0c;然后在性能上和字段属性赋值上的问题&#xff0c;一直是为开发者所…...

STM32H750 HAL CUBEMX 时钟失败及死机无法下载问题解决

芯片采样电压设置&#xff0c;否则 无法运行 解决死机问题 设置swd 模式 短接 boot0 —vcc 3.3v即可正常下载...

paddlespeech on centos7

概述 paddlespeech是百度飞桨平台的开源工具包&#xff0c;主要用于语音和音频的分析处理&#xff0c;其中包含多个可选模型&#xff0c;提供语音识别、语音合成、说话人验证、关键词识别、音频分类和语音翻译等功能。 paddlespeech整体是比较简单易用的&#xff0c;但是安装…...

ROM是什么? 刷ROM是什么意思?

文章目录 ROM是什么&#xff1f;刷ROM是什么意思 ROM是什么&#xff1f; ROM是只读内存&#xff08;Read-Only Memory&#xff09;的简称&#xff0c;是一种只能读出事先所存数据的固态半导体存储器。其特性是一旦储存资料就无法再将之改变或删除。通常用在不需经常变更资料的…...

华为云Stack的学习(五)

六、华为云stack服务简介 1.云服务在华为云Stack中的位置 云服务对接多个数据中心资源池层提供的资源&#xff0c;并向各种行业应用提供载体。 2.华为云Stack通用服务 2.1 云计算的服务模式 2.2 计算相关的云服务 2.3 存储相关的云服务 2.4 网络相关的云服务 3.云化案例 **…...

【LeetCode-中等题】904. 水果成篮

文章目录 题目方法一&#xff1a;滑动窗口方法二&#xff1a; 题目 题目的意思就是&#xff1a;找至多包含两种元素的最长子串&#xff0c;返回其长度 方法一&#xff1a;滑动窗口 class Solution { // 滑动窗口 找至多包含两种元素的最长子串&#xff0c;返回其长度public …...

【C++】哈希——哈希的概念,应用以及闭散列和哈希桶的模拟实现

前言&#xff1a; 前面我们一同学习了二叉搜索树&#xff0c;以及特殊版本的平衡二叉搜索树&#xff0c;这些容器让我们查找数据的效率提高到了O(log^2 N)。虽然效率提高了很多&#xff0c;但是有没有一种理想的方法使得我们能提高到O(1)呢&#xff1f;其实在C语言数据结构中&a…...

Kubernetes (K8s) 解读:微服务与容器编排的未来

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f405;&#x1f43e;猫头虎建议程序员必备技术栈一览表&#x1f4d6;&#xff1a; &#x1f6e0;️ 全栈技术 Full Stack: &#x1f4da…...

JavaScript学习--Day04

元字符 边界符&#xff1a; /^/&#xff1a;以什么开头 /$/&#xff1a;以什么结尾 量词&#xff1a; 预定义类&#xff1a;...

HCS 基本概念(三)

一、定义 HCS采用FusionSphere OpenStack作为云平台&#xff0c;对各个物理数据中心资源做整合&#xff0c;采用ManageOne作为数据中心管理软件对多个数据中心提供统一管理&#xff0c;通过云平台和数据中心管理软件协同运作&#xff0c;达到多数据中心融合、提升企业整体IT效率…...

通过curl命令分析http接口请求各阶段的耗时等

目录 一、介绍二、功能1、-v 输出请求 响应头状态码 响应文本等信息2、-x 测试代理ip是否能在该网站使用3、-w 额外输出查看接口请求响应的消耗时间4、-o 将响应结果存储到文件里面5、-X post请求测试 (没测成功用的不多) 一、介绍 Curl是一个用于发送和接收请求的命令行工具和…...

Linux工具——gcc

目录 一&#xff0c;gcc简介 二&#xff0c;C语言源文件的编译过程 1.预处理 2.编译 3.汇编 4.链接 5.动静态库 一&#xff0c;gcc简介 相信有不少的小白和我一样在学习Linux之前只听说过visual studio。其实这个gcc这个编译器实现的功能便是和visual studio一样的功能&…...

uni-app 使用uCharts-进行图表展示(折线图带单位)

前言 在uni-app经常是需要进行数据展示&#xff0c;针对这个情况也是有人开发好了第三方包&#xff0c;来兼容不同平台展示 uCharts和pc端的Echarts使用差不多&#xff0c;甚至会感觉在uni-app使用uCharts更轻便&#xff0c;更舒服 但是这个第三方包有优点就会有缺点&#xf…...

180B参数的Falcon登顶Hugging Face,vs chatGPT 最好开源大模型使用体验

文章目录 使用地址使用体验test1:简单喜好类问题test2:知识性问题test3:开放性问题test4:中文支持test5:问题时效性test6:学术问题使用地址 https://huggingface.co/spaces/tiiuae/falcon-180b-demo 使用体验 相比Falcon-7b,Falcon-180b拥有1800亿的参数量...

服务器数据恢复-EMC存储磁盘损坏的RAID5数据恢复案例

服务器数据恢复环境&#xff1a; 北京某单位有一台EMC某型号存储&#xff0c;有一组由10块STAT硬盘组建的RAID5阵列&#xff0c;另外2块磁盘作为热备盘使用。RAID5阵列上层只划分了一个LUN&#xff0c;分配给SUN小机使用&#xff0c;上层文件系统为ZFS。 服务器故障&#xff1…...

Nginx优化文件上传大小限制

Nginx默认配置 Nginx 默认情况下&#xff0c;上传文件的大小为1M&#xff0c;超过1M就会返回413错误。只用对Nginx进行简单配置即可解决问题。 优化Nginx文件上传大小限制 可以在Nginx配置文件中配置 client_max_body_size 配置项。 设置客户端请求正文允许的最大大小。如果…...

navicat SSH连接数据库报错: Putty key format too new

问题 下载 Putty 0.79 生成了密钥&#xff0c;但是在navicat 15 使用SSH通道连接数据库报错: Putty key format too new 错误原因和处理 原来是因为生成的私钥格式是 V3 &#xff0c; navicat 15 只能识别 V2 所以&#xff0c;在 PuTTYgen Load 私钥&#xff0c;重新保存为 …...

基于大规模MIMO通信系统的半盲信道估计算法matlab性能仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 %EM算法收敛所需的迭代 nIter 1; Yp Y(:,1:L_polit,:); %与导频序列相对应的部分 q…...

自然语言处理学习笔记(九)———— OVV Recall Rate与 IV Recall Rate

目录 1.OVV Recall Rate 2. IV Recall Rate 1.OVV Recall Rate OOV指的是“未登录词”&#xff08;Out Of Vocabulary&#xff09;&#xff0c;或者俗称的“新词”&#xff0c;也即词典未收录的词汇。如何准确切分00V&#xff0c;乃至识别其语义&#xff0c;是整个NLP领域的核…...

区块链正在开启一场回归商业,融合商业的新发展

对于区块链来讲&#xff0c;它其实同样在延续着这样一种发展路径。   正如上文所说&#xff0c;区块链正在开启一场回归商业&#xff0c;融合商业的新发展。   而欲要实现这一点&#xff0c;区块链就是要从底层算法&#xff0c;底层数据传输&#xff0c;底层体系的打造着手…...

分享一份2026金三银四Java面试通关宝典!

金三银四快到了&#xff0c;不少人找LZ咨询&#xff0c;问我现在的面试需要提前准备什么&#xff1f;为了造福更多的开发者&#xff0c;也为了让更多的小伙伴通过面试&#xff1b;LZ近期也一直想着怎么才能帮到大家。所以近期在各大渠道整合大厂相关面试题&#xff0c;并结合了…...

告别树莓派原生系统:我在SpotMicro上成功部署ROS Kinetic的完整踩坑记录

从树莓派到ROS Kinetic&#xff1a;SpotMicro四足机器人深度改造实战 当树莓派原生系统在SpotMicro项目上反复报错时&#xff0c;我盯着纹丝不动的前腿舵机&#xff0c;意识到是时候转向更专业的ROS方案了。这不是简单的系统切换&#xff0c;而是一次从底层架构到控制逻辑的全面…...

MPC模型下四节电池SOC均衡控制技术:全网首发的效果超群解决方案

MPC模型预测控制四节电池SOC均衡 [1]全网首发电池SOC均衡控制&#xff0c;当前领域国内期刊罕有有人发。 [2]效果超群&#xff0c;根据电池均衡路径完美规划均衡电流&#xff0c;电流由大到小&#xff0c;避免均衡后期均衡路径问题。电池均衡这玩意儿听着高大上&#xff0c;说白…...

FPGA实战:8点FFT运算的Verilog实现与误差优化技巧

FPGA实战&#xff1a;8点FFT运算的Verilog实现与误差优化技巧 在数字信号处理领域&#xff0c;快速傅里叶变换&#xff08;FFT&#xff09;算法是频谱分析的核心工具。对于FPGA开发者而言&#xff0c;掌握FFT的硬件实现不仅能提升系统性能&#xff0c;更能深入理解算法与硬件的…...

3步实现跨次元游戏模组管理:XXMI启动器的多游戏统一解决方案

3步实现跨次元游戏模组管理&#xff1a;XXMI启动器的多游戏统一解决方案 【免费下载链接】XXMI-Launcher Modding platform for GI, HSR, WW and ZZZ 项目地址: https://gitcode.com/gh_mirrors/xx/XXMI-Launcher 还在为《原神》《崩坏&#xff1a;星穹铁道》等多款二次…...

2026Agent元年!手把手教你从0到1搭建高能智能体,小白也能秒变大神!

逼自己练完这些&#xff0c;你的Agent搭建就很牛了&#xff01;&#xff01;2026年可谓是Agent元年&#xff0c;智能体&#xff08;AI Agent&#xff09;正以惊人的速度重塑我们的工作方式&#xff0c;从简单的被动响应工具&#xff0c;进化为能自主规划、执行、协作的"数…...

效率提升秘籍:用快马AI自动生成技能评估系统的管理后台与评分引擎

今天想和大家分享一个提升开发效率的实用技巧——如何快速搭建技能评估系统的核心模块。最近在做一个叫skill-vetter的项目&#xff0c;发现其中很多功能其实可以通过智能工具自动生成&#xff0c;省去了大量重复编码的时间。 题库管理模块的实现思路 这个模块的核心需求是让…...

Python AOT编译卡在wasm-ld阶段?揭秘2026年新引入的WASI-SDK v22.0工具链冲突——附3行patch脚本+验证清单

第一章&#xff1a;Python AOT编译卡在wasm-ld阶段&#xff1f;揭秘2026年新引入的WASI-SDK v22.0工具链冲突——附3行patch脚本验证清单自2026年WASI-SDK v22.0发布以来&#xff0c;Python官方AOT编译流程&#xff08;基于pyodide-build aot&#xff09;在链接阶段频繁阻塞于w…...

BM12O2321-A高集成H桥模块的9位UART驱动原理与Arduino库实践

1. 项目概述BM12O2321-A 是由 Basetron&#xff08;BestModules&#xff09;推出的高集成度 H 桥驱动模块&#xff0c;专为中小功率直流电机、电磁阀、LED 阵列等双向负载控制场景设计。该模块并非传统意义上的分立 H 桥芯片&#xff08;如 L298N、TB6612FNG&#xff09;&#…...

C语言回调函数在TCP客户端中的实现与应用

C语言回调函数在TCP客户端中的实现与应用1. 回调函数基础概念回调函数是一种通过函数指针实现的编程机制&#xff0c;允许将一个函数作为参数传递给另一个函数。在C语言中&#xff0c;回调函数的实现完全依赖于函数指针&#xff0c;这与C、Python等现代语言中可能使用仿函数或匿…...