认识MapStruct
1、MapStruct是用来做什么的在一个成熟的工程中尤其是现在的分布式系统中应用与应用之间还有单独的应用细分模块之后DO 一般不会让外部依赖这时候需要在提供对外接口的模块里放 DTO 用于对象传输也即是 DO 对象对内DTO对象对外DTO 可以根据业务需要变更并不需要映射 DO 的全部属性。这种对象与对象之间的互相转换就需要有一个专门用来解决转换问题的工具毕竟每一个字段都 get/set 会很麻烦。MapStruct 是一种属性映射工具只需要定义一个 Mapper 接口MapStruct 就会自动实现这个映射接口避免了复杂繁琐的映射实现。2、案例创建实体 user.javaGetter Setter NoArgsConstructor AllArgsConstructor public class User { private String userId; private String name; private Integer age; private String email; private Date birthDate; }创建实体VO userVo.javaGetter Setter AllArgsConstructor NoArgsConstructor public class UserVo { private String name; private Integer age; private String email; private Date birth; private String birthformat; }###创建Mapper UserConverterMapper.java可以看到UserConverterMapper是一个接口的形式存在的当然也可以是一个抽象类如果你需要在转换的时候才用个性化的定制的时候可以采用抽象类的方式相应的代码配置官方文档已经声明。Mapper注解是用于标注接口、抽象类是被MapStruct自动映射的标识只有存在该注解才会将内部的接口方法自动实现。Mapper(componentModel spring) public interface UserConverterMapper { UserConverterMapper INSTANCE Mappers.getMapper(UserConverterMapper.class); User UserVo2User(UserVo userVo); Mappings({ //属性名不一致映射 Mapping(source birthdate, target birth), //属性格式不一致 Mapping(target birthformat, expression java(org.apache.commons.lang3.time.DateFormatUtils.format(person.getBirthdate(),\yyyy-MM-dd HH:mm:ss\))), }) UserVo User2UserVo(User user); ListUser UsersVo2Users(ListUserVo userVos); ListUserVo Users2UserVos(ListUser user); }在Mapper接口定义方法上面声明了一系列的注解映射Mapping以及Mappings那么这两个注解是用来干什么工作的呢Mapping注解我们用到了两个属性分别是source、target,参数名称和参数类型不一致的时候可以使用映射参数关系。source代表的是映射接口方法内的参数名称如果是基本类型的参数参数名可以直接作为source的内容如果是实体类型则可以采用实体参数名.字段名的方式作为source的内容配置如上面UserConverterMapper内容所示。target代表的是映射到方法方法值内的字段名称配置如上面UserConverterMapper所示。###Mapper的实现MapStruct根据我们配置的Mapping注解自动将source实体内的字段进行了调用target实体内字段的setXxx方法赋值并且做出了一切参数验证。Component public class UserConverterMapperImpl implements UserConverterMapper { public UserConverterMapperImpl() { } public User UserVo2User(UserVo userVo) { if (userVo null) { return null; } else { User user new User(); user.setBirthDate(userVo.getBirth()); user.setName(userVo.getName()); user.setAge(userVo.getAge()); user.setEmail(userVo.getEmail()); return user; } } public UserVo User2UserVo(User user) { if (user null) { return null; } else { UserVo userVo new UserVo(); userVo.setBirth(user.getBirthDate()); userVo.setName(user.getName()); userVo.setAge(user.getAge()); userVo.setEmail(user.getEmail()); userVo.setBirthformat(DateFormatUtils.format(user.getBirthDate(), yyyy-MM-dd HH:mm:ss)); return userVo; } } public ListUser UsersVo2Users(ListUserVo userVos) { if (userVos null) { return null; } else { ListUser list new ArrayList(userVos.size()); Iterator var3 userVos.iterator(); while(var3.hasNext()) { UserVo userVo (UserVo)var3.next(); list.add(this.UserVo2User(userVo)); } return list; } } public ListUserVo Users2UserVos(ListUser user) { if (user null) { return null; } else { ListUserVo list new ArrayList(user.size()); Iterator var3 user.iterator(); while(var3.hasNext()) { User user1 (User)var3.next(); list.add(this.User2UserVo(user1)); } return list; } } }###测试和使用测试验证获取Mapper的方式就是采用Mappers通过动态工厂内部反射机制完成Mapper实现类的获取。public class ConverterTest { public static void main(String[] args) { UserVo userVo new UserVo(张三,22,1212qq.com,new Date(),null); User user UserConverterMapper.INSTANCE.UserVo2User(userVo); Assert.assertTrue(userVo.getName().equals(user.getName())); Assert.assertTrue(userVo.getAge().equals(user.getAge())); UserVo vo UserConverterMapper.INSTANCE.User2UserVo(user); Assert.assertTrue(vo.getName().equals(user.getName())); Assert.assertTrue(vo.getAge().equals(user.getAge())); } }使用在Mapper注解内添加componentModel属性值配置后在外部可以采用Autowired方式注入Mapper实现类完成映射方法调用由mapstruct自动生成的类文件会发现标记了Component注解。Autowired public UserConverterMapper userConverterMapper; RequestMapping(value /fetchUsers,method RequestMethod.GET) ResponseBody public BaseResultListUserVo fetchBatch(String name){ BaseResultListUserVo result new BaseResult(); try{ UserCondition condtion new UserCondition(); condtion.setName(name); ListUser userList userService.fetchUserList(condtion); ListUserVo vos this.userConverterMapper.Users2UserVos(userList); result.setCode(0); result.setMess(succ); result.setData(vos); return result; }catch (Exception e){ return result; } }调用返回结果{code:0, mess:succ, data:[ { name:小米, email:1212qq.com, birth:2019-08-14 03:34:56, age:22 }] }3、总结它可以自动封装一些同级属性名相同的属性名如上name age 属性可以无需手动写 Mapping对于非同级或属性名 需要写相关的 mapping 属性名不同可以查考 birth 属性配置。如果不同级Mapping(source “XXX.birthDate”, target “XX.birth”) 如此就行了。mapping 还有很多属性,可以查看API。

相关新闻

9月1日刷题:1-4

9月1日刷题:1-4

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。 示例:给定 nums [2, 7, 11, 15], target…

2026/7/28 18:13:07 阅读更多 →
基于地理位置算法GeoHash核心原理解析

基于地理位置算法GeoHash核心原理解析

文章目录认知GeoHash算法步骤根据经纬度计算GeoHash二进制编码组码GeoHash Base32编码长度与精度具体应用使用注意点认知GeoHash GeoHash将二维的经纬度转换成字符串,如北京9个区域的GeoHash字符串,分别是WX4ER,WX4G2、WX4G3等等,每一个字符…

2026/7/28 18:12:07 阅读更多 →
Eureka-Server的搭建

Eureka-Server的搭建

1.pom.xml<?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 …

2026/7/28 18:12:07 阅读更多 →

最新新闻

Java面向对象设计模式

Java面向对象设计模式

设计模式&#xff08;Design Patterns&#xff09; ——可复用面向对象软件的基础 设计模式&#xff08;Design pattern&#xff09;是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠…

2026/7/28 18:18:09 阅读更多 →
零训练AI换脸神器:roop-unleashed专业级面部替换终极指南

零训练AI换脸神器:roop-unleashed专业级面部替换终极指南

零训练AI换脸神器&#xff1a;roop-unleashed专业级面部替换终极指南 【免费下载链接】roop-unleashed Evolved Fork of roop with Web Server and lots of additions 项目地址: https://gitcode.com/gh_mirrors/ro/roop-unleashed 想要在几分钟内实现专业级的面部替换效…

2026/7/28 18:18:09 阅读更多 →
django-QueryDict对象

django-QueryDict对象

视图中&#xff0c;用户发送的get与post请求数据&#xff0c;都被封装为QueryDict对象了 认识一下QueryDict对象 该对象类似于一个字典 QueryDict源码 class QueryDict(MultiValueDict):"""A specialized MultiValueDict which represents a query string.A Que…

2026/7/28 18:18:09 阅读更多 →
【AI副业掘金指南】:零基础新手7天启动变现闭环,亲测月入5000+的5个低门槛赛道

【AI副业掘金指南】:零基础新手7天启动变现闭环,亲测月入5000+的5个低门槛赛道

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;AI副业的本质认知与新手破局心法 AI副业不是“用AI工具接单”的简化劳动&#xff0c;而是以AI为杠杆&#xff0c;重构个人能力交付模式的认知升级过程。其本质在于将领域知识、问题拆解能力与模型调用工程化三…

2026/7/28 18:18:09 阅读更多 →
2026 中小企业 AI 搜索流量破局:基于轻量化 RAG 架构与语义向量对齐的 GEO 平台工程实战

2026 中小企业 AI 搜索流量破局:基于轻量化 RAG 架构与语义向量对齐的 GEO 平台工程实战

摘要在生成式 AI&#xff08;Perplexity、ChatGPT Search、豆包、Kimi 等&#xff09;全面接管信息检索入口的 2026 年&#xff0c;传统依赖关键词堆砌与外部链接的搜索引擎优化&#xff08;SEO&#xff09;正快速向生成式引擎优化&#xff08;Generative Engine Optimization,…

2026/7/28 18:18:09 阅读更多 →
计算机毕业设计之《计算机网络》在线学习平台设计与实现

计算机毕业设计之《计算机网络》在线学习平台设计与实现

随着新世纪无纸化办公方式的普及&#xff0c;自动化信息处理和基于网络的信息交互方式已被广泛应用。现在很多行业基本上都是交由计算机进行管理和测试&#xff0c;网络与计算机已成为整个线上管理体系中的重要组成部分。虽然信息技术广泛应用和数据存取更加方便&#xff0c;但…

2026/7/28 18:17:09 阅读更多 →

日新闻

告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿&#xff01;3步让你的暗影精灵笔记本重获新生 【免费下载链接】OmenSuperHub Control Omen laptop performance, fan speeds, and keyboard lighting, and unlock power limits. 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub 你是否也曾为官方Om…

2026/7/28 0:00:43 阅读更多 →
RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

做 RAG 的人应该都踩过这个致命的坑&#xff1a;把几百页的财报、法规、技术手册扔给向量库&#xff0c;问一个具体问题&#xff0c;搜出来的全是沾边但没用的内容 —— 关键信息要么被硬切块拆碎了&#xff0c;要么藏在几十条结果的最下面。语义相似≠真正相关&#xff0c;这个…

2026/7/28 0:00:43 阅读更多 →
抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

2026年做短视频运营&#xff0c;从抖音上扒文案早就不是偷偷抄笔记的事了。我刚开始做内容的时候&#xff0c;每天刷半小时抖音&#xff0c;手动把爆款视频的口播敲进备忘录&#xff0c;一条2分钟的视频得花十来分钟&#xff0c;碰到语速快的还要反复回听。后来试了一圈工具&am…

2026/7/28 0:00:43 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档&#xff0c;可以直接使用&#xff01;系统支持图片、视频、摄像头等多种方式检测裂缝&#xff0c;功能强大实用。 1数据集6000张 8各类别

2026/7/28 12:04:22 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像&#xff01; pubg绝地求生目标检测数据集 1分类&#xff1a;e_body&#xff0c;14905个标签&#xff0c;txt格式 共计14244张图&#xff0c;99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/28 8:29:16 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别&#xff1a; allies enemy tag图片总量&#xff1a;7247张训练集&#xff1a;5139张验证集&#xff1a;1425张测试集&#xff1a;683张标注状态&#xff1a;全部已标注&#xff0c;即拿即用数据格式&#xff1a;支持YOLO格式及其他格式&#…

2026/7/28 5:03:42 阅读更多 →

月新闻