注解@Mapper(componentModel = "spring")-自动生成DTO-DO的模型映射
注解@Mapper(componentModel = "spring")-自动生成VO-DO的模型映射
场景: 插件可以自动生成实现类,实现DTO-DO各种模型之间的字段映射(不仅仅限制于DTO-DO)
- 第一步: 引入pom文件
<!--mapStruct依赖-->
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-jdk8</artifactId>
<version>1.2.0.CR1</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.2.0.CR1</version>
<scope>provided</scope>
</dependency>
- 第二步:
@Mapper(componentModel = "spring")
public interface TodoItemMapper {TodoItemVO toTodoItemVO(TodoItemDO todoItemDO);
List<TTodoItem> toTodoItems(List<TodoItemDO> todoItemDOS);
TodoItemDO toTodoItemDO(TodoItemVO todoItemVO);
List<TodoItemVO> toTodoItemVOS(List<TodoItemDO> todoItemDOS);
}
-
其中可以发现这个类被定义成一个interfece,并且没有实现类。在其他地方自动注入TodoItemMapper时只会出现红线提示,但是编译会通过,这让我有点不解。问完mentor才知道,是@mapper(componentModel = “spring”)起了作用。
该标签可以动态的完成DTO-DO之间的转换,这样程序员就可以免去写DO,VO,DTO各类之间转换关系的代码了。
编译之后,会在target包中生成对应的实现类:
@Component
public class TodoItemMapperImpl implements TodoItemMapper {
public TodoItemMapperImpl() {
}public TodoItemVO toTodoItemVO(TodoItemDO todoItemDO) {
if (todoItemDO == null) {
return null;
} else {
TodoItemVO todoItemVO = new TodoItemVO();
todoItemVO.setId(todoItemDO.getId());
todoItemVO.setUserId(todoItemDO.getUserId());
todoItemVO.setContent(todoItemDO.getContent());
todoItemVO.setStatus(todoItemDO.getStatus());
todoItemVO.setTopicId(todoItemDO.getTopicId());
return todoItemVO;
}
}public List<TTodoItem> toTodoItems(List<TodoItemDO> todoItemDOS) {
if (todoItemDOS == null) {
return null;
} else {
List<TTodoItem> list = new ArrayList(todoItemDOS.size());
Iterator var3 = todoItemDOS.iterator();while(var3.hasNext()) {
TodoItemDO todoItemDO = (TodoItemDO)var3.next();
list.add(this.todoItemDOToTTodoItem(todoItemDO));
}return list;
}
}public TodoItemDO toTodoItemDO(TodoItemVO todoItemVO) {
if (todoItemVO == null) {
return null;
} else {
TodoItemDO todoItemDO = new TodoItemDO();
todoItemDO.setId(todoItemVO.getId());
todoItemDO.setUserId(todoItemVO.getUserId());
todoItemDO.setContent(todoItemVO.getContent());
todoItemDO.setStatus(todoItemVO.getStatus());
todoItemDO.setTopicId(todoItemVO.getTopicId());
return todoItemDO;
}
}public List<TodoItemVO> toTodoItemVOS(List<TodoItemDO> todoItemDOS) {
if (todoItemDOS == null) {
return null;
} else {
List<TodoItemVO> list = new ArrayList(todoItemDOS.size());
Iterator var3 = todoItemDOS.iterator();while(var3.hasNext()) {
TodoItemDO todoItemDO = (TodoItemDO)var3.next();
list.add(this.toTodoItemVO(todoItemDO));
}return list;
}
}protected TTodoItem todoItemDOToTTodoItem(TodoItemDO todoItemDO) {
if (todoItemDO == null) {
return null;
} else {
TTodoItem tTodoItem = new TTodoItem();
tTodoItem.setId(todoItemDO.getId());
tTodoItem.setUserId(todoItemDO.getUserId());
tTodoItem.setContent(todoItemDO.getContent());
tTodoItem.setStatus(todoItemDO.getStatus());
tTodoItem.setCreatedTime(todoItemDO.getCreatedTime());
tTodoItem.setUpdatedTime(todoItemDO.getUpdatedTime());
tTodoItem.setTopicId(todoItemDO.getTopicId());
return tTodoItem;
}
}
}
@Mapper(componentModel = "spring")
public interface RoleConvert {
RoleDO convert(RoleCreateDTO roleCreateDTO);
}
使用:
@Autowired
private RoleConvert roleConvert;
// 转化
RoleDO roleDO = roleConvert.convert(roleCreateDTO);
- 第三步: 看编译后自动生成的实现类
编译后自动生成了RoleConvert 的实现类 RoleConvertImpl.class
image.png
- 第四步: 高级用法,指定映射字段
@Mapper(componentModel = "spring")
public interface ProductConverter {
@Mappings({
@Mapping(source = "id",target = "productId"),
@Mapping(source = "title",target = "productName"),
@Mapping(source = "price",target = "salePrice"),
@Mapping(source = "sellPoint",target = "subTitle"),
@Mapping(source = "image",target = "picUrl")
})
ProductDto item2Dto(ItemDocument item);
}