mapstruct- 让VO,DTO,ENTITY转换更加便捷

mapstruct- 让VO,DTO,ENTITY转换更加便捷

1. 简介

MapStruct是一个代码生成器,简化了不同的Java Bean之间映射的处理,所谓映射指的就是从一个实体变化成一个实体。例如我们在实际开发中,DAO层的实体和一些数据传输对象(DTO),大部分属性都是相同的,只有少部分的不同,通过mapStruct,可以让不同实体之间的转换变的简单。我们只需要按照约定的方式进行配置即可。

2. 使用背景

项目中有很多的VO和实体,在进行各层之间数据传输的时候,就需要不断进行转换,之前手敲的getset,非常的枯燥乏味且低效,刚好遇到了这个工具。

使用mapstruct,仅需要我们写一个interface,接口使用@Mapper标注,并且提供一个静态的实例,之后编写转换的方法,方法的参数是转换的原类型,方法的返回值是转换的目标类型。

3. 开发环境

  • maven
  • jdk1.8
  • idea

4. pom

<properties>
    <maven.compiler.source>8</maven.compiler.source>
    <maven.compiler.target>8</maven.compiler.target>
    <mapstruct.version>1.4.2.Final</mapstruct.version>
</properties>
<dependencies>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>RELEASE</version>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>org.mapstruct</groupId>
        <artifactId>mapstruct</artifactId>
        <version>${mapstruct.version}</version>
    </dependency>
    <dependency>
        <groupId>org.mapstruct</groupId>
        <artifactId>mapstruct-processor</artifactId>
        <version>${mapstruct.version}</version>
    </dependency>
</dependencies>

注意: **pom文件中,依赖的引入顺序为先引入lombok,再引入mapstruct的依赖。**否则在mapstruct映射的时候,转换的对象没有getset方法,将会遇到很多问题:

  • 比如 Error:(15, 13) java: No property named “id“ exists in source parameter(s). Did you mean “null“?

  • 比如生成的转换接口实现类中,没有对应的getset,无法转换

5. entity和VO

相互转换的类

package com.drc.mapstruct.vo;

import lombok.Data;

import java.util.Date;
@Data
public class OrderVO {
    private String orderId;
    private String product;
    private String money;
    private Date date;
}
package com.drc.mapstruct.entity;

import lombok.Data;

import java.util.Date;

@Data
public class OrderEntity {
    private Integer id;
    private String orderId;
    private String product;
    private String money;
    private Date date;
    private String userId;
}

6. OrderConverter

需要定义的转换接口

package com.drc.mapstruct.converter;

import com.drc.mapstruct.entity.OrderEntity;
import com.drc.mapstruct.vo.OrderVO;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;
import org.mapstruct.factory.Mappers;

@Mapper
public interface OrderConverter {
    OrderConverter INSTANCE = Mappers.getMapper(OrderConverter.class);
    // 将实体类转换成VO
    OrderVO orderEntityToVO(OrderEntity orderEntity);
    // 将VO转换成实体类
    OrderEntity orderVOToEntity(OrderVO orderVO);
}

7. mvn compile

编译之后即可生成OrderConvert实现类,实现类在target目录中,实现类的具体代码可以在里面看到

我在网上查了下,有说需要手工编译(进入到pom所在的目录,cmd中执行mvn compile),idea不行

我这边两个都试了,都OK的

8. 实现类

package com.drc.mapstruct.converter;

import com.drc.mapstruct.entity.OrderEntity;
import com.drc.mapstruct.vo.OrderVO;
import javax.annotation.Generated;

@Generated(
    value = "org.mapstruct.ap.MappingProcessor",
    date = "2023-02-15T17:10:28+0800",
    comments = "version: 1.4.2.Final, compiler: javac, environment: Java 1.8.0_301 (Oracle Corporation)"
)
public class OrderConverterImpl implements OrderConverter {

    @Override
    public OrderVO orderEntityToVO(OrderEntity orderEntity) {
        if ( orderEntity == null ) {
            return null;
        }

        OrderVO orderVO = new OrderVO();

        orderVO.setOrderId( orderEntity.getOrderId() );
        orderVO.setProduct( orderEntity.getProduct() );
        orderVO.setMoney( orderEntity.getMoney() );
        orderVO.setDate( orderEntity.getDate() );

        return orderVO;
    }

    @Override
    public OrderEntity orderVOToEntity(OrderVO orderVO) {
        if ( orderVO == null ) {
            return null;
        }

        OrderEntity orderEntity = new OrderEntity();

        orderEntity.setOrderId( orderVO.getOrderId() );
        orderEntity.setProduct( orderVO.getProduct() );
        orderEntity.setMoney( orderVO.getMoney() );
        orderEntity.setDate( orderVO.getDate() );

        return orderEntity;
    }
}

9. 使用

使用也很简单,直接使用接口中定义的常量就能获得转换器对象,之后调用方法就可以进行转换

简单示例:

OrderConverter orderConverter = OrderConverter.INSTANCE;
OrderEntity orderEntity = new OrderEntity();
orderEntity.setId(1);
orderEntity.setOrderId("10001");
orderEntity.setDate(Date.from(Instant.now()));
orderEntity.setMoney("1000元");
orderEntity.setProduct("自行车");
orderEntity.setUserId("9999");
OrderVO orderVO = orderConverter.orderEntityToVO(orderEntity);
System.out.println(orderVO);
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值