-
2022-03-22 21:48:38
官方文档:https://mapstruct.org/documentation/dev/reference/html/
1.场景介绍
2.为什么要用框架?
- 复杂而多的业务逻辑,不能突出业务的重点
- 重复的劳动,代码无法复用
3.使用介绍
3.1引入POM
<dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct</artifactId> <version>1.4.2.Final</version> </dependency> <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-processor</artifactId> <version>1.4.2.Final</version> </dependency>
3.2新建抽象类并标注
@Mapper
@Mapper public interface UserConvert
3.3编写转换方法
/** * userDTO->UserVO */ UserVO dto2vo(UserDTO userDTO);
3.4动态获取Convert实例
public UserConvert INSTANCE = Mappers.getMapper(UserConvert.class);
3.5测试
UserDO userDO = UserDO.builder() .id(1) .username("maofeiyu") .authorities(Arrays.asList("123", "455", "4343")) .createTime(LocalDateTime.now()) .updateTime(LocalDateTime.now()) .version(1).build(); System.out.println(JSON.toJSONString(userDO, true)); UserDTO userDTO = UserConvert.INSTANCE.do2dto(userDO); System.out.println(JSON.toJSONString(userDTO, true));
4.高级配置
4.1@Mapper
默认映射规则
- 同类型,同名的属性会自动映射
自动类型转换
- 8种基本数据类型和他们的包装类型会自动进行转换
- 8种基本数据类型和String之间会自动进行转换
- 日期类型和String之间会自动转换
4.2@Mappings和@Mapping
- 指定属性之间的映射关系
- 数字格式化 numberFormat = “#.00”
- 日期格式化 dateFormat = “yyyy-MM-dd HH:mm:ss”
- source或者target多余的属性不会报错
- ignore忽略属性映射(需要自己手动赋值)
- 属性是引用的处理(需要在同一个类中配置引用类型的转换处理)
- 批量映射(需要先指定单一映射)
4.3案例
4.3.1基本类型转换配置
@Mappings( value = { /** * @param source-源属性名 * @param target-转换对象属性名 * @param numberFormat-数字格式化规则 */ @Mapping( source = "totalPrice", target = "totalPrice", numberFormat = "#.00" ), /** * @param source-源属性名 * @param target-转换对象属性名 * @param dateFormat-日期格式化规则 */ @Mapping( source = "publishDate", target = "publishDate", dateFormat = "yyyy-MM-dd HH:mm:ss" ), /** * @param target-忽略的目标属性 */ @Mapping(target = "color", ignore = true), @Mapping(source = "driverDTO", target = "driverVO"), } )
4.3.2引用类型配置转换
@Mappings( value = { @Mapping(source = "id", target = "id"), @Mapping(source = "name", target = "fullname") } ) UserVO userDTO2userVO(UserDTO userDTO);
4.4批量转换
原始方法:for循环进行便利添加 优化做法:使用stream流进行遍历 高级做法:使用mapStruct进行批量转换
/** * 批量转换 */ abstract List<UserVO> dto2vos(List<UserDTO> carDTO);
5.高级注解
5.1@AfterMapping和@MappingTarget自定义属性
在映射的最后一步,进行
自定义属性
的映射处理场景:两种完全不同的类型需要映射(自定义映射)
/** * 描述: 表示让mapstruct在调用完自动转换方法之后,会自动调用本方法 * 自定义属性映射处理 */ @AfterMapping public void dto2voafter(UserDTO userDTO, @MappingTarget UserVO userVO) { // @MappingTarget 标识当前传递过来的target对象是已经赋值过得 // 手动获取属性进行判断,并赋值 List<UserDTO> partDTOs = userDTO.getPartDTOs(); boolean hasPartDTOs = partDTOs != null && !partDTOs.isEmpty(); userVO.setHasPart(hasPartDTOs); }
5.2@BeanMapping
忽略默认映射行为,避免不需要的赋值,避免属性覆盖
场景:我们在映射的过程中,target类拥有很多的属性,但是只有几个属性需要我们
自动映射
,其他属性需要手动进行设置
原始的方式: 通过@Mapping的方式来ignore来进行忽略(但是如果有非常多的属性不适合使用)/** * 配置忽略mapStruct的默认映射行为,只映射那些@Mapping的属性 */ @BeanMapping(ignoreByDefault = true) @Mapping(source = "id", target = "id") abstract UserVO userdto2uservo(UserDTO userDTO);
5.3@InheritConfiguration
- 更新的场景
5.4@InheritInverseConfiguration
- 反向反射过来不用重新写一次
只集成@Mapping注解配置,不会集成@BeanMapping
6.SpringBoot整合
注入Bean到Spring容器中
@Mapper(componentModel="spring") 本质:给生成的类添加了一个@Component注解
更多相关内容 -
mapstruct-idea:IntelliJ IDEA插件,可与MapStruct一起使用
2021-05-02 01:31:12IntelliJ IDEA插件,可与MapStruct一起使用 什么是MapStruct? MapStruct是一个Java用于为Java Bean类生成类型安全和高性能的映射器。 要了解有关MapStruct的更多信息,请查看存储库或 特征 代码完成 完成@Mapping... -
mapstruct-spi-protobuf:Mapstruct的Protobuf访问器命名策略
2021-03-31 23:27:23用于协议缓冲区的Mapstruct SPI实现 这种命名策略有助于在您的域类和protobuf类之间生成有效的映射代码。 无论和类支载。 注意:取决于mapstruct 1.4.0.CR1ProtobufAccessor命名策略扩展... -
mapstruct-jdk8-1.2.0.Final-API文档-中文版.zip
2022-06-26 13:43:44赠送jar包:mapstruct-jdk8-1.2.0.Final.jar; 赠送原API文档:mapstruct-jdk8-1.2.0.Final-javadoc.jar; 赠送源代码:mapstruct-jdk8-1.2.0.Final-sources.jar; 赠送Maven依赖信息文件:mapstruct-jdk8-1.2.0.... -
mapstruct-1.3.1.Final-API文档-中文版.zip
2022-05-09 21:06:48赠送jar包:mapstruct-1.3.1.Final.jar; 赠送原API文档:mapstruct-1.3.1.Final-javadoc.jar; 赠送源代码:mapstruct-1.3.1.Final-sources.jar; 赠送Maven依赖信息文件:mapstruct-1.3.1.Final.pom; 包含翻译后... -
mapstruct-jdk8-1.2.0.Final-API文档-中英对照版.zip
2022-06-12 16:26:26赠送jar包:mapstruct-jdk8-1.2.0.Final.jar; 赠送原API文档:mapstruct-jdk8-1.2.0.Final-javadoc.jar; 赠送源代码:mapstruct-jdk8-1.2.0.Final-sources.jar; 赠送Maven依赖信息文件:mapstruct-jdk8-1.2.0.... -
MapStruct:如何使您的映射任务成为
2021-05-16 17:52:36MapStruct 如何使您的映射任务变得有趣而有趣 它是什么? MapStruct是一个代码生成器,它基于约定优于配置的方法极大地简化了Java bean类型之间映射的实现。 生成的映射代码使用简单的方法调用,因此快速,类型... -
JDK11使用MapStruct
2022-05-21 20:56:50JDK11使用MapStruct -
mapstruct-examples:使用MapStruct的示例
2021-05-24 15:56:00MapStruct示例该存储库包含一些示例,这些示例显示了如何使用 (Java注释处理器)来生成类型安全的bean映射类。 当前,存在以下示例: mapstruct-on-ant :显示如何在基于Ant的项目中使用MapStruct; 要构建此示例,... -
MapStruct实体转换及List转换的方法讲解
2020-08-26 06:06:08今天小编就为大家分享一篇关于MapStruct实体转换及List转换的方法讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧 -
MapStruct实体间转换的简单用法
2020-08-26 06:05:53今天小编就为大家分享一篇关于MapStruct实体间转换的简单用法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧 -
mapstruct-1.1.0.Final-API文档-中文版.zip
2022-07-12 22:03:54赠送jar包:mapstruct-1.1.0.Final.jar; 赠送原API文档:mapstruct-1.1.0.Final-javadoc.jar; 赠送源代码:mapstruct-1.1.0.Final-sources.jar; 赠送Maven依赖信息文件:mapstruct-1.1.0.Final.pom; 包含翻译后... -
mapstruct-spring-extensions-example
2021-03-29 00:17:04mapstruct-spring-extensions-example -
MapStruct处理Java中实体与模型间不匹配属性转换的方法
2020-08-26 06:08:26今天小编就为大家分享一篇关于MapStruct处理Java中实体与模型间不匹配属性转换的方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧 -
mapstruct-processor-1.2.0.Final-API文档-中英对照版.zip
2022-06-12 16:25:53赠送jar包:mapstruct-processor-1.2.0.Final.jar; 赠送原API文档:mapstruct-processor-1.2.0.Final-javadoc.jar; 赠送源代码:mapstruct-processor-1.2.0.Final-sources.jar; 赠送Maven依赖信息文件:mapstruct... -
mapstruct-1.3.1.Final-API文档-中英对照版.zip
2022-05-03 21:13:41赠送jar包:mapstruct-1.3.1.Final.jar; 赠送原API文档:mapstruct-1.3.1.Final-javadoc.jar; 赠送源代码:mapstruct-1.3.1.Final-sources.jar; 赠送Maven依赖信息文件:mapstruct-1.3.1.Final.pom; 包含翻译后... -
mapstruct-1.2.0.Final-API文档-中文版.zip
2022-07-13 23:48:40赠送jar包:mapstruct-1.2.0.Final.jar; 赠送原API文档:mapstruct-1.2.0.Final-javadoc.jar; 赠送源代码:mapstruct-1.2.0.Final-sources.jar; 赠送Maven依赖信息文件:mapstruct-1.2.0.Final.pom; 包含翻译后... -
【java】mapstruct自定义类的转换示例(csdn)————程序.pdf
2021-12-04 14:38:12【java】mapstruct自定义类的转换示例(csdn)————程序 -
mapstruct-demo:该项目说明了如何使用mapstruct API自动执行Java映射
2021-05-19 02:56:11mapstruct-demo 该项目说明了如何使用mapstruct API自动执行Java映射 什么是MapStruct MapStruct是一个代码生成器,它基于约定优于配置的方法极大地简化了Java bean类型之间映射的实现。 生成的映射代码使用简单的... -
mapstruct_sandbox:在SpringBoot项目中使用mapstruct玩沙盒
2021-05-19 10:22:27mapstruct_sandbox 沙盒,用于在SpringBoot项目中使用Mapstruct,H2和LiquibaseMapStruct概述MapStruct是一个代码生成器,它基于约定优于配置的方法极大地简化了Java bean类型之间映射的实现。 项目设置用途: 摇动... -
mapstruct:用于生成类型安全的bean映射器的注释处理器
2021-02-03 17:24:16MapStruct-Java Bean映射,简单方法!什么是MapStruct? MapStruct是一个Java用于为Java Bean类生成类型安全和高性能的映射器。 它使您不必手工编写映射代码,这是一个繁琐且容易出错的任务。 该生成器具有合理的... -
MapStruct-简化不同类型bean之间映射的代码生成器
2019-08-07 03:14:14MapStruct - 简化不同类型bean之间映射的代码生成器,基于一个约定优于配置的方式。 -
Java编码辅助工具Mapstruct用法详解
2020-08-25 21:28:21主要介绍了Java编码辅助工具Mapstruct用法详解,手动编码setter/getter各个对应属性,会显得臃肿繁琐。通过Mapstruct框架可简单方便地完成这一工作。,需要的朋友可以参考下 -
mapstruct
2022-03-18 19:48:39(2)mapstruct会自动类型转化,支持的类型转化的类型如下: <1> 基本类型和他们对应的包装类型之间会自动转化; <2> 8中基本类型(包括他们的包装类型)和String类型之间的转化。 ...大致四部:
第一步:引入依赖
第二步:新建一个抽象类或接口,并标注Mapper注解
第三步:编写转化方法
第四步:获取对象并调用方法@Mapper注解
默认映射规则:
(1)同名且同类型的属性,会自动映射,不同类型会尝试转化为同一类型。
(2)mapstruct会自动类型转化,支持的类型转化的类型如下:
<1> 基本类型和他们对应的包装类型之间会自动转化;
<2> 8中基本类型(包括他们的包装类型)和String类型之间的转化。
<3> 日期类型和String之间转化1、需求把UserEntity对象转化为Student对象:
三个实体类:
// Roles =================================== import lombok.AllArgsConstructor; import lombok.Data; @Data @AllArgsConstructor public class Roles { public Long roleId; public String name; } // Student =================================== import lombok.AllArgsConstructor; import lombok.Data; import java.math.BigDecimal; import java.util.Date; @Data @AllArgsConstructor public class Student { public Long studentId; public String name; public String age; public String score; public Roles roles; public Date createTime; } // UserEntity =================================== import lombok.AllArgsConstructor; import lombok.Data; import java.math.BigDecimal; import java.util.Date; @Data @AllArgsConstructor public class UserEntity { public Long userId; public String name; public Integer age; public Double score; public Roles roles; public String createTime; }
引入包:
<properties> <org.mapstruct.version>1.4.1.Final</org.mapstruct.version> </properties> <!-- mapStruct 核心注解 --> <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct</artifactId> <version>${org.mapstruct.version}</version> </dependency> <!-- mapStruct 根据接口生成实现类 --> <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-processor</artifactId> <version>${org.mapstruct.version}</version> <scope>provided</scope> </dependency>
补充:
· 获取UserConvert 对象实例两种方式:
方式一:public static UserConvert INSTANCE = Mappers.getMapper(UserConvert.class);
使用:在调用类中直接通过类来掉用该实例
方式二:在UserConvert类的@Mapper注解中添加 componentModel = "spring"
使用:在调用类中可直接注入UserConvert@SpringBootTest class SpringbootTest1ApplicationTests { @Autowired UserConvert userConvert; @Test void convert() { Student student = userConvert.UserEntityToStudent(new UserEntity("lxc")); System.out.println(student); } }
在编译的源码中,mapstruct会帮助我们在实现类上添加@Component注解
编写抽象类或接口:
import com.example.springboottest1.domain.Student; import com.example.springboottest1.domain.UserEntity; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; @Mapper public abstract class UserConvert { // 获取UserConvert 对象实例 public static UserConvert INSTANCE = Mappers.getMapper(UserConvert.class); // 把UserEntity转化为Student public abstract Student userConvertToStudent(UserEntity userEntity); }
测试:
// @SpringBootTest class SpringbootTest1ApplicationTests { @Test void convert() { // 提前把Roles和UserEntity填充好 Roles roles = new Roles(2L, "学生角色"); UserEntity userEntity = new UserEntity(1L, "lxc", 20, "123.235", roles, new Date()); // 调用UserConvert类进行转化 Student student = UserConvert.INSTANCE.userConvertToStudent(userEntity); System.out.println(student); } }
打印如下:
字段不同,所以studentId 为null,createTime不是正常的时间格式,Date转字符串。
@Mappings 和 @Mapping 注解
@Mappings是一个数组,可定义映射规则。
@Mapping是映射规则的实现。其常用方法如下:(1)source 源对象、target 目标对象
(2)dateFormat 日期格式化、numberFormat 数字格式化
(3)ignore 忽略某个属性(不会映射到目标对象)color属性不会映射到目标对象。
需求二:对于不同字段需要映射,时间格式"yyyy-MM-dd HH:mm:ss",小数点保留2位
@Mapper public abstract class UserConvert { public static UserConvert INSTANCE = Mappers.getMapper(UserConvert.class); // 值是一个数组,类型是 Mapping @Mappings(value = { @Mapping(source = "userId", target = "studentId"), @Mapping(source = "createTime", target = "createTime", dateFormat = "yyyy-MM-dd HH:mm:ss"), @Mapping(source = "score", target = "score", numberFormat = "#.00") }) public abstract Student userConvertToStudent(UserEntity userEntity); }
@AfterMapping 和@MappingTarget
对映射完的对象进行自定义处理(属性的自定义处理),标注@AfterMapping 注解的方法,会在对象映射完毕之后执行,可以在这个时机做一些处理;@MappingTarget标注在参数字段之前,标记这是映射完的目标对象。
例子:UserEntity和Student映射完之后,,我们把StudentRoles中的id改变。@Data @AllArgsConstructor public class UserEntity {public Roles roles;}
@Data @AllArgsConstructor public class Roles {public Long roleId;public String name;}
@Data @AllArgsConstructor public class Student {public StudentRoles studentRoles;}
@Data @AllArgsConstructor public class StudentRoles {public Long roleId;public String name;}
@Mapper public abstract class UserConvert { public static UserConvert INSTANCE = Mappers.getMapper(UserConvert.class); @Mappings( @Mapping(source = "roles", target = "studentRoles") ) public abstract Student UserEntityToStudent(UserEntity userEntity); // 下边方法会在UserEntity 和Student对象映射完执行 @AfterMapping public void handleAfter(UserEntity userEntity, @MappingTarget Student student){ // 对于映射完的对象做自定义处理 student.getStudentRoles().setRoleId(100L); } }
测试:
// @SpringBootTest class SpringbootTest1ApplicationTests { @Test void convert() { Roles roles = new Roles(2L, "学生角色"); Student student = UserConvert.INSTANCE.UserEntityToStudent(new UserEntity(roles)); System.out.println(student.getStudentRoles()); } }
批量映射
@Mapper public abstract class UserConvert { public static UserConvert INSTANCE = Mappers.getMapper(UserConvert.class); public abstract List<Student> userToStudent(List<Student> studentList); }
@BeanMapping
ignoreByDefault:可忽略mapstruct的默认映射行为。避免不需要的赋值、避免属性覆盖。
只会映射配置了@Mapping注解的字段。
@Mapper public abstract class UserConvert { public static UserConvert INSTANCE = Mappers.getMapper(UserConvert.class); @BeanMapping(ignoreByDefault = true) public abstract Student UserEntityToStudent(UserEntity userEntity); }
测试:
@Test void convert() { Student student = UserConvert.INSTANCE.UserEntityToStudent(new UserEntity("lxc")); System.out.println(student); }
结果,studentName字段没有被映射:
添加@Mapping
@Mapper public abstract class UserConvert { public static UserConvert INSTANCE = Mappers.getMapper(UserConvert.class); @BeanMapping(ignoreByDefault = true) @Mapping(source = "name", target = "studentName") public abstract Student UserEntityToStudent(UserEntity userEntity); }
-
mapstruct, 一种用于生成安全bean映射器.zip
2019-10-10 12:13:14mapstruct, 一种用于生成安全bean映射器 MapStruct - Java映射,简单的方法 ! 什么是 MapStruct?要求使用 MapStructMavenGradle文档并获取帮助信息。许可协议来自源代码的构建链接什么是 -
mapstruct-reference-guide.pdf
2020-09-11 16:28:39MapStruct是一个代码生成器,它基于约定优于配置的方法极大地简化了Java bean类型之间映射的实现。生成的映射代码使用简单的方法调用,因此速度快,类型安全且易于理解 -
mapstruct-1.1.0.Final.jar
2021-01-10 14:44:48mapstruct-1.1.0.Final.jarmapstruct-1.1.0.Final.jar -
mapstruct-1.0.0.Final.jar
2021-01-10 14:45:02mapstruct-1.0.0.Final.jarmapstruct-1.0.0.Final.jar -
mapstruct-1.0.0.CR1.jar
2021-01-10 14:45:25mapstruct-1.0.0.CR1.jarmapstruct-1.0.0.CR1.jarmapstruct-1.0.0.CR1.jar