为了符合“高内聚,低耦合”思想,现在主流使用三层架构模式,即:表示层(UI)、业务逻辑层(BLL)和[数据访问层,各层之间采用接口相互访问,并通过对象模型的实体类(Model)作为数据传递的载体。随着一个工程的越来越成熟,模块划分会越来越细,不同层级,不同模块之间实体类的传递和映射就会变得更复杂。
虽然当前BeanUtils.copyProperties(Object source, Object target)可以做到相同属性的映射,但是在不同的业务场景下,需要对不同的属性进行映射时,使用MapStruct就可以很好的解决这个问题。。。
MapStruct官网地址: http://mapstruct.org/
如何使用
- 工程中引入 maven 依赖
<!-- MapStruct -->
<dependency>
<groupId>org.mapstruct</groupId>
<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>
- 创建两个Bean,UserVO和UserDTO
@Data
@Accessors(chain = true)
public class UserVO {
private String name;
private String age;
private Date birthday;
private String phone;
}
@Data
@Accessors(chain = true)
public class UserDTO {
private String realName;
private String realAge;
private String realBirthday;
private String photo;
}
- 写一个 Mapper 接口 PersonConverter,对UserVO和UserDTO做映射。
@Mapper(componentModel = "spring")
public interface UserConverter {
//UserConverter INSTANCE = Mappers.getMapper(UserConverter.class);
@Mappings({
@Mapping(source = "name", target = "realName"),
@Mapping(source = "age", target = "realAge"),
@Mapping(source = "birthday", target = "realBirthday", dateFormat = "yyyy-MM-dd HH:mm:ss"),
@Mapping(target = "photo", ignore = true)
})
UserDTO VO2DTO(UserVO userVO);
}
Spring 注入的方式:
1、和框架 Spring 结合,在 @Mapper 后面加入 componentModel="spring"
2、通过PersonConverter INSTANCE = Mappers.getMapper(PersonConverter.class)注入。
测试
@Autowired
private UserConverter userConverter;
@Test
void mapStructTest() {
UserVO userVO = new UserVO();
userVO.setAge("11").setBirthday(new Date()).setName("张三").setPhone("120");
UserDTO userDTO = userConverter.uservo2userdto(userVO);
System.out.println(userDTO);
}
输出:
UserDTO(realName=张三, realAge=11, realBirthday=2021-09-10 14:44:27, photo=null)
这里只是一些比较简单的使用,更多的使用方法和功能可以去看官方文档。
http://mapstruct.org/documentation/stable/reference/html/
网友评论