MapStruct 概述
MapStruct 是一个用于生成映射器接口的代码生成库,主要用于简化 Java 对象之间的转换过程。在处理不同模型之间数据转换时,MapStruct 可以自动生成实现类减少手工转换逻辑的工作量。
使用场景:各种模型之间的转换。
BO
,DTO
,VO
,POJO
…
使用步骤:
- 引入
mapstruct
的pom依赖 - 定义
mapper
接口(注意,这里不是MyBatis的Mapper哦),使用@Mapper
注解标记,并在接口中声明映射方法。 - 编写映射方法,(从xxxO转换为yyyO,模型之间的转换)
- 在业务层中使用
Mapper
接口定义的方法,进行模型之间的转换。
MapStruct 使用例子
列举一种最简单的mapstruct的使用,dto->entity的转换
UserDTO
@Data // lombok
public class UserDTO {
private String name;
private int age;
}
UserEntity
@Data // lombok
public class UserEntity {
private String username;
private int userAge;
}
UserDTOConverter ( mapstruct 接口)
@Mapper
public interface UserModelConverter {
UserModelConverter INSTANCE = Mappers.getMapper(UserModelConverter.class);
/**
* dto->entity 的转换
*/
UserEntity convertDtoToEntity(UserDTO dto);
/**
* entity->dto 的转换
*/
UserDTO convertEntityToDto(UserEntity entity);
}
UserModelConverterImpl (自动生成)
xxxConvertImpl会自动在mvn构建时生成在target目录下,这里写出来,只是为了让大家了解它的本质就是bean的转换
public class UserModelConverterImpl implements UserModelConverter {
@Override
public UserEntity convertDtoToEntity(UserDTO userDto) {
if ( userDto == null ) {
return null;
}
UserEntity useEntity = new UserEntity();
useEntity.setUserName( userDto.getName() );
useEntity.setUserAge( userDto.getAge() );
return useEntity;
}
@Override
public UserDTO convertEntityToDto(UserEntity userEntity) {
if ( userEntity == null ) {
return null;
}
UserDTO userDto = new UserDTO();
userDto.setName( userEntity.getUserName() );
userDto.setAge( userEntity.getUserAge() );
return userDto;
}
}
自动生成的impl类贴图:
Service 层使用
public class UserServiceImpl implements UserService {
@Override
public add(UserDTO userDto){
UserEntity userEntity = UserModelConverter.INSTANCE
.convertDtoToEntity(userDto);
// 插入到数据库中 ....
}
}
更详细的用法,可以参考 MapStruct 快速指南 | Baeldung中文网 (baeldung-cn.com)