工具功能描述:
1、将Map映射到对象的属性值;
2、完成对象和对象间的属性值映射(ep:DTO->BO);
3、完成对象集合的属性值映射;
大概原理:
MapStruct是在编译期间生成setter/getter方法。
实际运行时就是直接调用setter/getter,效率会非常高。
优点:
1、MapStruct编译期生成映射代码,所以可以在编译时暴露映射错误的代码;
2、因为使用setter/getter,而非反射方式,所以可以更快的执行效率;
3、可以实现深度拷贝,自动类型转换,如枚举转换;
4、支持自定义的映射;
依赖:
<dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct</artifactId> </dependency> <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-processor</artifactId> </dependency>
使用案例:
1、定义接口:
@Mapper(componentModel = "spring") public interface MenuConverter { MenuVO entity2Vo(SysMenu entity); MenuForm entity2Form(SysMenu entity); SysMenu form2Entity(MenuForm menuForm); }
2、调用:
public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> implements SysMenuService { private final MenuConverter menuConverter;
private List<MenuVO> buildMenuTree(Long parentId, List<SysMenu> menuList) { return CollectionUtil.emptyIfNull(menuList) .stream() .filter(menu -> menu.getParentId().equals(parentId)) .map(entity -> { MenuVO menuVO = menuConverter.entity2Vo(entity); List<MenuVO> children = buildMenuTree(entity.getId(), menuList); menuVO.setChildren(children); return menuVO; }).toList(); }}
补充:
1、@Mapper注解的componentModel属性
componentModel属性用于指定自动生成的接口实现类的组件类型。这个属性支持四个值:
default: 这是默认的情况,mapstruct不使用任何组件类型, 可以通过Mappers.getMapper(Class)方式获取自动生成的实例对象。
cdi: the generated mapper is an application-scoped CDI bean and can be retrieved via @Inject
spring: 生成的实现类上面会自动添加一个@Component注解,可以通过Spring的 @Autowired方式进行注入
jsr330: 生成的实现类上会添加@javax.inject.Named 和@Singleton注解,可以通过 @Inject注解获取
2、更多调用方式参考:神器MapStruct,性能爆棚的实体转换 / 复制工具_mapstruct 集合转换-CSDN博客