MapStruct 是什么?

更新时间 2023-08-11 09:25:40

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡 / 赠书活动

目前, 星球 内第2个项目《仿小红书(微服务架构)》正在更新中。第1个项目:全栈前后端分离博客项目已经完结,演示地址:http://116.62.199.48/。采用技术栈 Spring Boot + Mybatis Plus + Vue 3.x + Vite 4手把手,前端 + 后端全栈开发,从 0 到 1 讲解每个功能点开发步骤,1v1 答疑,陪伴式直到项目上线,目前已更新了 255 小节,累计 39w+ 字,讲解图:1716 张,还在持续爆肝中,后续还会上新更多项目,目标是将 Java 领域典型的项目都整上,如秒杀系统、在线商城、IM 即时通讯、权限管理等等,已有 1300+ 小伙伴加入,欢迎点击围观

MapStructMapStruct

前言

在后端开发中,经常需要将一个对象的数据映射到另一个对象上,如将 DO 对象(数据库层)转换成 DTO 对象(数据传输对象)。如果纯手动 new 对象,一个属性一个属性的 set ,如果字段非常多,就显得非常繁琐,又臭又长,可维护性和可读性都非常差。于是,开发人员常常会使用一些对象映射框架。

什么是 MapStruct ?

MapStruct 是一个流行且强大的 Java 对象映射框架,它能够自动生成类型安全的映射代码,减少手动编写重复的映射逻辑。 仅需通过简单的注解和声明,它会为您在编译期间自动生成映射代码,从而提高代码质量、减少出错的可能性,并节省开发时间。

主要特性

  1. 类型安全:生成的映射代码是类型安全的。任何源和目标属性之间的不匹配都会在编译时被检测到。
  2. 性能:性能最强的对象映射工具,不接受反驳。MapStruct 使用普通的方法调用进行映射,这意味着它的速度与手写的映射代码相似,没有反射的开销。
  3. 简洁性:不需要为每个属性编写冗长的复制代码。一旦定义了映射器接口和必要的注解,MapStruct 会为您做其余的工作。
  4. 可定制性:虽然大部分的映射可以自动完成,但 MapStruct 也提供了多种方式来自定义特定的映射行为。
  5. 易于集成:MapStruct 不需要额外的运行时库,只需要在构建过程中添加依赖即可。它与 Spring 等常用框架很好地集成,不会引入额外的复杂性。
  6. 简洁的 API 和注解: MapStruct 的 API 和注解都非常直观,这使得学习和使用它变得简单。此外,由于它只使用注解来定义映射,因此不需要额外的 XML 或配置文件。
  7. 支持不可变对象和构建器模式:MapStruct 支持映射到不可变对象,以及那些使用了构建器模式的对象,这使其适应现代 Java 开发中的多种设计模式。
  8. 持续的社区支持:MapStruct 有一个积极的开发者社区,这确保了持续的改进、新功能的添加以及问题的及时解决。

如何使用?

MapStruct 通过处理自定义注解来工作。您只需要定义一个接口,并使用 @Mapper 注解来标注它。在这个接口中,为每个转换定义一个方法,MapStruct 将会为您生成该接口的实现类,包含了所有必要的映射代码。

例如:

@Mapper
public interface CarMapper {
    CarDto carToCarDto(Car car);
}

在上述示例中,CarMapper 是一个接口,定义了如何将 Car 对象映射到 CarDto 对象。MapStruct 将自动生成此接口的实现,并为 CarCarDto 之间的每个具有相同名称和类型的属性生成映射代码。

总结

MapStruct 提供了一种简洁、类型安全且高效的方式来转换 Java 对象。它的目标是简化对象映射的工作,使开发者能够专注于主要的业务逻辑,而不是反复编写样板代码。