一、MapStruct是一个代码生成器,简化了不同的Java Bean之间映射的处理,所以映射指的就是从一个实体变化成一个实体。例如我们在实际开发中,DAO层的实体和一些数据传输对象(DTO),大部分属性都是相同的,只有少部分的不同,通过mapStruct,可以让不同实体之间的转换变的简单。我们只需要按照约定的方式进行配置即可。
MapStruct是一个可以处理注解的Java编译器插件,可以在命令行中使用,也可以在IDE中使用。MapStruct有一些默认配置,但是也为用户提供了自己进行配置的途径。
缺点就是这玩意在使用工具自带的编译器是,不会生成实现类,需要通过maven的方式来进行编辑,才会生成实现类,总体上面来说还是很好用的。相对于BeanUtil等,简介性还是很明显的。目前MapStruct的版本基本都是固定了,可以自己尝试着弄一下。
二、用到MapStruct需要一个依赖包和一个插件(pom.xml的官方配置)
org.mapstruct
mapstruct
1.2.0.Final
org.apache.maven.plugins
maven-compiler-plugin
3.7.0
1.8
1.8
org.mapstruct
mapstruct-processor
1.2.0.Final
三、我这里谢了一个简单的例子供参考
packagecom.troy.jpa.service.mapper;importcom.troy.jpa.dto.UserDTO;importcom.troy.jpa.entity.User;importcom.troy.jpa.service.util.AgeUtil;importorg.mapstruct.InheritConfiguration;importorg.mapstruct.Mapper;importorg.mapstruct.Mapping;importorg.mapstruct.Mappings;importjava.util.List;
@Mapper(componentModel= "spring", uses = {AgeUtil.class})public interfaceUserMapper {
@Mappings({
@Mapping(source= "age", target = "age", qualifiedByName = {"AgeUtil", "ageAdd"}),
})
UserDTO userToDTO(User user);
@InheritConfiguration
User DTOToUser(UserDTO userDTO);
List userListToDTOList(Listusers);
}
packagecom.troy.jpa.service.util;importorg.springframework.stereotype.Component;importjavax.script.ScriptEngine;importjavax.script.ScriptEngineManager;importjavax.script.ScriptException;
@Componentpublic classAgeUtil {public String ageAdd(String age) throwsScriptException {
ScriptEngineManager engineManager= newScriptEngineManager();
ScriptEngine engine= engineManager.getEngineByName("JavaScript");
Object eval= engine.eval(age + "+1");returneval.toString();
}
}
说明:
1)在接口上面加入@Mapper,就可以实现实体和DTO之间的装换
2)componentModel 是加入模块,一般都是spring容器,在实现类中会加入@Component注解
3)uses引入外部类,用于实体和DTO之间的工具类
4) 多个@Mapping在@Mappings里面编写,也可以单个编写@Mapping。如果实体和DTO之间数据字段一样,可以不加任何注解
5)qualifiedByName 的用法,主要是用来转换特殊数据处理的自定义方式。{}中第一个代表bean,第二种达标方法。
6)@InheritConfiguration 的用法,也就是反向映射。当source,target字段不一样,写第一个。其它的映射可以不用再写@Mapping,直接加入@InheritConfiguration注解即可
7)@Mapping 中的ignore 赋值 true可以忽略某个字段(这个主要是在字段相同,但是类型不同,并且不能装换的时候用)
四、当然我这里主要是写的几种常用的用法,mapstruct中还有其他的写法,和api我这里不一一介绍。我提到的主要是比较常用的写法,其他很多方式。可能会用到。但是可以作为自己学习的开始。