认识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/10/31 11:43:22 阅读更多 →
基于地理位置算法GeoHash核心原理解析

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

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

2026/11/2 18:45:15 阅读更多 →
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/10/28 9:54:52 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年&#xff0c;我大部分时间都在跟浏览器标签页打交道&#xff0c;直到第一次把桌面应用跑起来&#xff0c;才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词&#xff0c;最开始是在某段时间频繁出现在同事的讨论里&#xff0c;一个用HTML…

2026/11/4 1:35:24 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介&#xff1a;亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档&#xff0c;主要面向智能锁安装人员、终端用户及售后维护者&#xff0c;帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件&#xff0c;大小4.37MB&#xff0c;内容结构清晰&#xff…

2026/11/3 10:57:27 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统&#xff0c;整车要求空载跑到8m/s&#xff0c;电机转速已经拉到额定点&#xff0c;驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令&#xff0c;转速纹丝不动&#xff0c;三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/11/3 11:35:49 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年&#xff0c;用它写过嵌入式驱动、做过游戏服务端&#xff0c;也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词&#xff0c;我其实挺感慨的——这门语言的难点从来不是语法多&#xff0c;而是知识点之间的耦合太深…

2026/11/4 6:23:50 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介&#xff1a;亚太天能T109滑盖智能锁产品说明书以PDF格式发布&#xff0c;适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开&#xff0c;先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能&#xff0c;再给出完整安装步骤&…

2026/11/3 10:47:27 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历&#xff1a;翻开源码注释、论文摘要或者一份专业报告&#xff0c;每个字都认识&#xff0c;连在一起却像天书。想找人聊聊&#xff0c;身边要么没人懂&#xff0c;要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型&#xff0c;几秒钟之后&a…

2026/11/4 19:19:54 阅读更多 →

日新闻

周新闻

月新闻