如何使用mapstruct优雅地对实体类对象进行属性拷贝

22 篇文章 0 订阅

在实际开发中,我们经常会遇到需要对VO,DTO,DO,VO,PO等类型的属性拷贝问题,而我们常用的方法是使用apache.Beanutils来对这些实体进行拷贝,而这样拷贝会存在List无法拷贝问题或者是性能的问题等等。
虽然目前还有其他几种常用的工具类可以用作属性拷贝,但是本文主要讲解mapstruct如何使用,因此,本文中就不过多赘述了。
mapstruct是一种性能比较高并且书写较为方便的属性拷贝方法。

maven配置

1.首先我们得现在maven中配置好相关依赖,需要注意的是使用该方法的前提应先添加lombok依赖,如下:

<!-- 注意:以下依赖如果不添加,则会存在编译报错问题 -->
<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct-jdk8</artifactId>
    <version>1.3.1.Final</version>
</dependency>
<!-- --------------------------------------- -->
<!-- mapstruct配置 -->
<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct-processor</artifactId>
    <version>1.3.1.Final</version>
    <scope>provided</scope>
</dependency>
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <annotationProcessorPaths>
                    <path>
                        <groupId>org.projectlombok</groupId>
                        <artifactId>lombok</artifactId>
                        <version>1.18.4</version>
                    </path>
                    <path>
                        <groupId>org.mapstruct</groupId>
                        <artifactId>mapstruct-processor</artifactId>
                        <version>1.3.1.Final</version>
                    </path>
                </annotationProcessorPaths>
            </configuration>
        </plugin>
    </plugins>
</build>

实例演示

2.为了方便理解,以下通过一个简单的例子进行演示,方便大家理解。
School.class

public class School {

    /**
     * 学校id
     */
    private Long schoolId;

    /**
     * 学校名称
     */
    private String schoolName;
    
    /**
     * 校长实体
     */
    private Headmaster headmaster;

}

Headmaster.class

public class Headmaster{

    /**
     * 学校id
     */
    private Long schoolId;

    /**
     * 校长名称
     */
    private String name;

}

SchoolVO

public class School {

    /**
     * 学校id
     */
    private Long schoolId;

    /**
     * 学校名称
     */
    private String schoolName;
    
    /**
     * 校长名称
     */
    private String headmasterName;

}

我们需要根据业务新增接口,来对实体进行转换

//import ......
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;

//注意:此@Mapper并非spring中的@Mapper注解,切勿弄混
@Mapper
public interface SchoolToMapping {

    /**
     * 获取该类自动生成的实现类的实例(在调用时会用到)
     */
    SchoolToMapping INSTANCES = Mappers.getMapper(SchoolToMapping.class);
    
    @Mappings({
            @Mapping(source = "headmaster.name", target = "headmasterName")
    })
    SchoolVO toVO(School school);

    List<SchoolVO> toVOList(List<School> list);
}

以下则是正常业务类

@Service
public class SchoolServiceImpl implements ISchoolService {

    @Autowired
    private SchoolMapper schoolMapper;
    
    public SchoolVO selectArticleInfoList(School school){
        SchoolMapper instances = SchoolToMapper.INSTANCES;
        SchoolVO schoolVO = instances.toVO(school)
        return schoolVO;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值