学习目标
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 一、mapstruct是什么?
- 1.1 使用背景
- 1.2 优势
- 二、基础用法
- 2.1 导入mapstruct依赖
- 2.2创建2个实体类
- 2.3 定义映射器
- 测试
一、mapstruct是什么?
1.1 使用背景
- 需求场景多。
在我们日常的Java开发工作中,经常会遇到模型对象的转化,例如从实体类转化为DTO模型,DTO转化为VO、TO等模型的业务场景 - 模型转化枯燥、编码价值低。而模型的转化是枯燥且无技术含量的,不仅耗费大量时间而且很容易出错
- 问题排查困难。若涉及多个具有很多字段的Bean的模型转化时,不得不排查是否两个模型的相同字段的转化映射关系有缺失
1.2 优势
- MapStruct 是一个 Java注释处理器,用于生成类型安全的 bean 映射类。
- 您所要做的就是定义一个Bean的映射抽象类,在该抽象类中声明任何所需的映射方法。
- 在编译期间,MapStruct 将生成此抽象类的实现类。这个实现使用普通的 Java 方法调用来映射源对象和目标对象。
- 与手动编写映射代码相比,MapStruct 通过生成编写繁琐且容易出错的代码来节省时间。
- 与动态映射框架相比,MapStruct 具有以下优势:
(1)通过使用普通方法getter、setter调用,而不是反射来快速执行,效率很高。
(2)编译时类型安全:只能映射相互映射的对象和属性,不会将其余模型属性进行映射
二、基础用法
2.1 导入mapstruct依赖
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.5.0.Beta1</version>
</dependency>
<!--mapstruct编译-->
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.5.0.Beta1</version>
</dependency>
//lombok的依赖最好是1.16.16的以上
<dependency>
<groupid>org.projectlombok</groupid>
<artifactid>lombok</artifactid>
<version>1.18.12</version>
</dependency>
2.2创建2个实体类
@Data
@Accessors(chain = true) //加了这个注解之后,那么导入的时候无法获取到值
public class Person {
String describe;
private String id;
private String name;
private int age;
private BigDecimal source;
private double height;
private Date createTime;
}
@Data
@Accessors(chain = true) //加了这个注解之后,那么导入的时候无法获取到值
public class PersonDTO {
String describe;
private Long id;
private String personName;
private String age;
private String source;
private String height;
private String createTime;
}
2.3 定义映射器
其中target 代表的是PersonDTO 中的字段,source 代表的是Person中的字段
//指定依赖注入框架
@Mapper(componentModel = "spring")
public interface PersonConvert {
//PersonConvert INSTANCT = Mappers.getMapper(PersonConvert.class);
@Mappings({
//不对2个相同的字段进行映射
@Mapping(target = "id",ignore = true),
//对2个不相同的字段进行映射
@Mapping(target = "personName",source = "name"),
//如果describe为空时,那么它的默认值为admin
@Mapping(target = "describe",source = "describe",defaultValue = "admin"),
//如果属性从字符串映射到日期,则该格式字符串可由SimpleDateFormat处理
@Mapping(target = "createTime",source = "createTime",dateFormat = "yyyy-mm-dd")
})
PersonDTO convert(Person person);
//多个源对象
@Mappings({@Mapping( target = "createTime",source = "basicEntity.createTime")})
PersonDTO convert(Person person, BasicEntity basicEntity);
//使用其他的值
@Mapping(target = "id",source = "id")
PersonDTO convert(Person person,String id);
}
测试
@Autowired
private PersonConvert personConvert;
@GetMapping
public PersonDTO list(){
Person person = new Person();
person.setAge(12).setName("hy").setId("1").setCreateTime(new Date());
PersonDTO personDTO = personConvert.convert(person);
return personDTO;
}