1.作为对象映射工具
2.从目前得使用情况以及结合网上得文章来看,与使用得方法名无关,比如,两个单个得对象间映射,A,B
你名字可以叫做 A toEntity(B b) 也可以叫做 A btoA(B b)
再或者集合映射 你可以是List<A> toEntitys(List<B> bs) 也可以是 List<A> map(List<B> bs)
只要你的类型对应上了就好
3.先上代码再bb
这个接口是我们项目公共的,继承了这个接口就不用在子接口里再写toEntity和fromEntitys等方法了
public interface Converter<DO, ENTITY> {
/**
* Convert a data object to a domain object
*
* @param data data object
* @return domain object
*/
ENTITY toEntity(DO data);
/**
* Convert multiple data objects to domain objects
*
* @param data data objects
* @return domain objects
*/
List<ENTITY> toEntities(List<DO> data);
/**
* Convert a domain object to a data object
*
* @param entity domain object
* @return data object
*/
DO fromEntity(ENTITY entity);
/**
* Convert multiple domain objects to data objects
*
* @param entities domain objects
* @return data objects
*/
List<DO> fromEntities(List<ENTITY> entities);
}
@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface EmployeeConverter extends Converter<Employee, com.ai.ep.domain.employee.Employee> {
/**
* Convert a data object to a domain object
*
* @param data data object
* @return domain object
*/
@Override
@Mappings({
@Mapping(source = "lastName", target = "employeeName"),
@Mapping(source = "personId", target = "employeeId.id")
})
com.ai.ep.domain.employee.Employee toEntity(Employee data);
/**
* Convert a data object to a domain object
*
* @param data data object
* @return domain object
*/
@Mappings({
@Mapping(source = "lastName", target = "employeeName"),
@Mapping(source = "personId", target = "employeeId.id")
})
com.ai.ep.domain.employee.Employee toEntity(HiredOrLeftEmployee data);
/**
* convert staff to domain
*
* @param data
* @return
*/
@Mappings({
@Mapping(source = "staffId", target = "employeeId.id"),
@Mapping(source = "staffCode", target = "employeeNumber"),
@Mapping(source = "staffName", target = "employeeName"),
@Mapping(source = "staffAccount", target = "ntAccount"),
@Mapping(source = "email", target = "emailAddress"),
@Mapping(source = "staffType", target = "employeeType"),
@Mapping(source = "costCenter", target = "costCenterId"),
@Mapping(source = "bgId", target = "businessGroupId"),
@Mapping(source = "orgId", target = "organizationId"),
})
com.ai.ep.domain.employee.Employee toEntity(AccountStaffDTO data);
/**
* Convert a data object to a domain object
*
* @param data data object
* @return domain object
*/
List<com.ai.ep.domain.employee.Employee> toHireOrLeftEntities(List<HiredOrLeftEmployee> data);
}
4.使用方法:
4.1这是一个接口,需要在接口上标注@Mapper注解,注意这里得mapper和mybatis无关
4.2@Mapper中得unmappedTargetPolicy属性
不加这个属性,在两个实体有不一致字段但是没处理得时候,build时就会报错,无法映射
加上
unmappedTargetPolicy = ReportingPolicy.IGNORE
就会忽略不一致且未处理的属性
4.3方法上的
@Mappings
是两个实体间所需要处理的集合,@Mappings中使用@Mapping注解,通过source和target做单个属性映射
4.4类型不同的映射
注意下这个
@Mapping(source = "staffId", target = "employeeId.id"),
源实体中staffId是一个字符串,目标实体的employeeId这个属性是一个对象,想把staffId映射到empployeeId中的id属性上
4.5枚举类型
MapStruct为什么能自动映射枚举类
可以看自动生成的impl,根据name映射
5.default方法