MapStruct到底是什么?
一、简介
现在的分布式系统中模块划分越来越细,不同模块的实体、DTO、DO等需要进行转换,这么多工程处理起来不是那么简单。
MapStruct 就是这样的一个属性映射插件,用于为Java Bean生成类型安全且高性能的映射。它基于编译阶段生成get/set代码,此实现过程中没有反射,不会造成额外的性能损失。只需要定义一个 Mapper 接口,MapStruct 就会自动实现这个映射接口,避免了繁琐的映射实现。
优点
与手工编写映射代码相比
- MapStruct通过生成冗长且容易出错的代码来节省时间。
与动态映射框架相比
- 简单泛型智能转换;
- 效率高:无需手动 set/get 或 implements Serializable 以达到深拷贝;
- 性能更高:使用简单的 Java 方法调用代替反射;
- 编译时类型安全:只能映射相同名称或带映射标记的属性;
- 编译时产生错误报告:如果映射不完整(存在未被映射的目标属性)或映射不正确(找不到合适的映射方法或类型转换)则会在编译时抛出异常。
二、Demo
2.1 导入依赖
使用该插件主要需要导入两个包:
::: details Maven | Gradle
Maven
<dependency> <groupId>org.mapstruct</groupId> <!-- jdk8以下就使用mapstruct --> <artifactId>mapstruct-jdk8</artifactId> <version>1.3.0.Final</version> </dependency> <!-- 注解处理器 --> <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-processor</artifactId> <version>1.3.0.Final</version> </dependency>
Gradle
plugins { ... id "com.diffplug.eclipse.apt" version "3.26.0" // Only for Eclipse } dependencies { ... compile 'org.mapstruct:mapstruct:1.4.2.Final' annotationProcessor 'org.mapstruct:mapstruct-processor:1.4.2.Final' testAnnotationProcessor 'org.mapstruct:mapstruct-processor:1.4.2.Final' // if you are using mapstruct in test code } ...
2.2 示例代码
::: details domain、vo、mapper、controller
domain/Person.java
@Data @Builder @NoArgsConstructor @AllArgsConstructor public class Person { private Long id; private String name; private Integer age; private Integer sex; }
vo/PersonVO.java
@Data @Builder @NoArgsConstructor @AllArgsConstructor public class PersonVO { private Long personId; private String personName; private Integer age; }
mapper/PersonMapper.java
@Mapper(componentModel = "spring") public interface PersonMapper { /** * ClassLoader 的方式获取当前 mapper (可以不用) */ PersonMapper INSTANCE = Mappers.getMapper(PersonMapper.class); /** * 实体转VO * source * @param person * @return PersonVO */ @Mappings({ @Mapping(source = "id", target = "personId"), @Mapping(source = "name", target = "personName") }) PersonVO toPersonVO(Person person); /** * VO转实体 * * @param person * @return PersonVO */ @Mappings({ @Mapping(source = "personId", target = "id"), @Mapping(source = "personName", target = "name"), @Mapping(target = "sex", ignore = true), }) Person toPerson(PersonVO person); }
Controller
@RestController @RequestMapping("/api") public class TestMapStructController { @Autowired PersonMapper personMapper; @GetMapping("convert") public List<Object> convertEntity() { ArrayList<Object> objectList = new ArrayList<>(); Person person = Person.builder() .id(5L) .name("zhangsan") .age(12) .sex(1) .build(); objectList.add(person); PersonVO personVO = personMapper.toPersonVO(person); Person person1 = personMapper.toPerson(personVO); objectList.add("person 转 personVO" + personVO); objectList.add("personVO 转 person" + person1); return objectList; } }
打包后会看见 mapstruct 为我们生成了 mapper 的实现类
三、 注解介绍
@Mapper :MapStruct 注解处理器会扫描这个注解
先介绍一下 @Mapper
注解的 componentModel
属性,该属性用于自动生成的接口实现类的组件类型,这个属性支持四个值:
1.default : 这是默认的情况,mapstruct 不使用任何组件类型, 可以通过Mappers.getMapper(Class)方式获取自动生成的实例对象。
2.cdi : 生成的映射器是一个应用程序范围的 CDI bean,可以通过 @Inject 检索
3.spring : 生成的实现类上面会自动添加一个@Component注解,可以通过Spring的 @Autowired方式进行注入
4.jsr330 : 生成的实现类上会添加@javax.inject.Named 和@Singleton注解,可以通过 @Inject注解获取
@Mappings:配置多个@Mapping
@Mapping 属性映射,若源对象属性与目标对象名字一致,会自动映射对应属性
1.source :参数类的属性
2.target :要转换的类的属性
3.ignore :配合 target 使用,表示改转换类的的属性不需要映射
4.expression :配合 target 使用,表示改转换类的的属性使用指定的表达式进行转换
@Mapping( target = "someProp", expression = "java(new TimeAndFormat( s.getTime(), s.getFormat() ))" )
5.expression :配合 target 使用,表示改转换类的的属性使用指定的表达式进行转换
@Mapping( target = "someProp", expression = "java(new TimeAndFormat( s.getTime(), s.getFormat() ))" )
其他请参考源文件或官网,后续用到再补充
到此这篇关于MapStruct到底是什么?的文章就介绍到这了,更多相关MapStruct的使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
SpringBoot中 Jackson 日期的时区和日期格式问题解决
因为最近项目需要国际化,需要能够支持多种国际化语言,目前需要支持三种(法语、英语、简体中文),这篇文章主要介绍了SpringBoot中 Jackson 日期的时区和日期格式问题,需要的朋友可以参考下2022-12-12java使用selenium自动化WebDriver等待的示例代码
显式等待和隐式等待是WebDriver中两种常用的等待方式,它们都可以用来等待特定的条件满足后再继续执行代码,本文给大家介绍java使用selenium自动化WebDriver等待,感兴趣的朋友一起看看吧2023-09-09一文详解SpringMVC中的@RequestMapping注解
@RequestMapping是一个用于映射HTTP请求到处理方法的注解,在Spring框架中使用,它可以用于控制器类和处理方法上,用来指定处理不同URL路径的请求,并定义请求的方法等,本文小编将给大家详细的介绍一下SpringMVC中的@RequestMapping注解,需要的朋友可以参考下2023-08-08SpringBoot整合ElasticSearch的示例代码
本篇文章主要介绍了SpringBoot整合ElasticSearch的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧2017-09-09
最新评论