1.MapStruct介绍
在现在多模块多层级的项目中,应用于应用之间,模块于模块之间数据模型一般都不通用,每层都有自己的数据模型。这种对象与对象之间的互相转换,目前都是使用get,set方法,或者使用自定义的Beans.copyProperties进行转换。使用get,set方式会使得编码非常的麻烦,BeanUtils.copyProperties的方式是使用反射的方式,对性能的消耗比较大。
Mapstruct的性能远远高于BeanUtils,
对象转换次数 属性个数 BeanUtils耗时 Mapstruct耗时 5千万次 6 14秒 1秒 5千万次 15 36秒 1秒 5千万次 25 55秒 1秒
MapStruct是一个开源的基于Java的代码生成器,用于创建实现Java Bean之间转换的扩展映射器。使用MapStruct,我们只需要创建接口,而该库会通过注解在编译过程中自动创建具体的映射实现,大大减少了通常需要手工编写的样板代码的数量。
2.maven项目使用MapStruct
2.1 pom依赖
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.5.0.Final</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.5.0.Final</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
2.2 配置打包插件
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>17</source>
<target>17</target>
<annotationProcessorPaths>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.5.0.Final</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
</plugins>
</build>
2.3 创建实体类
Source .java
@Data
public class Source {
private Long id;
private Date gmtCreate;
private Date createTime;
private Long buyerId;
private Long age;
private String userNick;
private String userVerified;
}
Target.java
@Data
public class `Target {
private Long id;
private Date gmtCreate;
private Date createTime;
private Long buyerId;
private Long age;
private String userNick;
private String userVerified;
}
2.4 创建映射接口
定义一个接口,其中包含源类和目标类之间的映射方法。MapStruct将在编译时自动为这个接口生成实现
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
@Mapper
public interface SourceTargetMapper {
SourceTargetMapper INSTANCE = Mappers.getMapper(SourceTargetMapper.class);
Target sourceToTarget(Source source);
}
2.5 测试映射接口
@Test
public void testMapStruct(){
Source source = new Source();
source.setId(1L);
source.setGmtCreate(new Date());
source.setCreateTime(new Date());
source.setBuyerId(43252534643L);
source.setAge(99L);
source.setUserNick("mapstruct测试");
source.setUserVerified("ok");
System.out.println(source);
Target target = SourceTargetMapper.INSTANCE.sourceToTarget(source);
System.out.println(target);
}
- 运行结果
Source{id=1, gmtCreate=Wed Oct 11 15:46:15 CST 2023, createTime=Wed Oct 11 15:46:15 CST 2023, buyerId=43252534643, age=99, userNick='mapstruct测试', userVerified='ok'}
Target{id=1, gmtCreate=Wed Oct 11 15:46:15 CST 2023, createTime=Wed Oct 11 15:46:15 CST 2023, buyerId=43252534643, age=99, userNick='mapstruct测试', userVerified='ok'}
3. @Mapping解决字段名不一致的问题
@Mapping(target = "targetName", source = "sourceName"),此处的意思就是在转化的过程中,将Source的Target属性值赋值给sourceName的targetName属性。
@Data
public class Source {
private String sourceName;
}
@Data
public class Target {
private String targetName;
}
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
@Mapper
public interface SourceTargetMapper {
@Mapping(target = "targetName", source = "sourceName")
Target sourceToTarget(Source source);
}
4.String转日期&String转数字&忽略某个字端&给默认值等
@Mapping(target = "createTime", source = "createTime", dateFormat = "yyyy-MM-dd")
@Mapping(target = "age", source = "age", numberFormat = "#0.00")
@Mapping(target = "id", ignore = true)
@Mapping(target = "userVerified", defaultValue = "defaultValue-2")
评论 (0)