初识mapstruct

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方法

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值