一、MapStruct是什么?
MapStruct是一种实体类映射框架,能够通过Java注解将一个实体类的属性安全地赋值给另一个实体类。有了mapstruct,只需要定义一个映射器接口,声明需要映射的方法,在编译过程中,mapstruct会自动生成该接口的实现类,实现将源对象映射到目标对象的效果。当系统使用领域驱动(DDD)或者有着明确分层时,在不同层级会使用PO、DTO、VO等不同类,那么类之间相互转换就是会经常遇到的问题,MapStruct就是为此出现的。
二、优势
- 效率高。当有大量数据需要进行转换时,相较于常用的BeanUtils有明显的性能优势。这里直接使用别人的测试结果。
- 无侵入。使用中只需要声明相应映射器接口即可,对原有代码无侵入性,具体可以看后续使用。
- 对于转换时,属性名称不一致、对象类型不同等问题有较好支持。
三、使用步骤
1.添加依赖
<dependency>
<groupId>org.mapstruct</groupId>
<!-- jdk8以下就使用mapstruct -->
<artifactId>mapstruct-jdk8</artifactId>
<version>1.2.0.Final</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.2.0.Final</version>
</dependency>
2.构建需要转换的实体
2.构建Mapper
3.实测
user = {"address":{"addressDetail":{"num":233,"street":"昌华街道"},"city":"榆林市","district":"横山区","province":"陕西省"},"age":26,"birthday":1653621195045,"company":{"name":"qax"},"nicknames":["aa","vv","bb"],"personList":[{"name":"qq","relationship":"哥哥"},{"name":"pp","relationship":"弟弟"}],"userId":"1111","username":"anne"}
userVO = {"address":{"addressDetailVo":{"number":233,"street":"昌华街道"},"city":"榆林市","district":"横山区","province":"陕西省"},"age":26,"birthdayStr":"2022-05-27 11:13:15","company":{"name":"qax"},"nicknames":["aa","vv","bb"],"persons":[{"namea":"qq","relationship":"哥哥"},{"namea":"pp","relationship":"弟弟"}],"userId":"1111","username":"anne"}
3.使用细节
-
source、target属性名称相同,可以直接转换(如果是对象,那么对象内部自己的属性名称也需要相同)
-
source、target基属性名称不同,需要在Mapper进行声明
-
上面转换集合类型,如果集合中对象属性名称不同,则需要声明
-
source、target对象嵌套属性名称不一致,只需要声明一次
-
日期类型转换过程进行格式化
-
source与target反向转换,可以重新声明,也可以引用正向转换方法
总结
以上就是今天要讲的内容,本文仅仅简单介绍了mapstruct的使用,如需进一步了解,请移步官网学习MapStruct官网。