【工具库】Java实体映射工具MapStruct

一.什么是MapStruct?

  MapStruct是用于代码中JavaBean对象之间的转换,例如DO转换为DTO,DTO转换为VO,或Entity转换为VO等场景,虽然Spring库和

Apache 的库提供了类似BeanUtils用于转换对象,但是性能不佳(需要判断类是否被加载,如果没加载,还要加载类。因此反射性能低),

并且要类型和名称一样才能进行映射,因此可以推荐使用MapStruct,不仅可以快速实现JavaBean之间的转换,且能实现List之间的转换,

而且性能不错;

二.使用MapStruct

  1.引入依赖:

 <dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct-jdk8</artifactId>
            <version>1.2.0.Final</version>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct-processor</artifactId>
            <version>1.2.0.Final</version>
            <optional>true</optional>
</dependency>

  2.编写转换器 这里使用Entity转换为VO对象为例

package com.gabriel.stage.vo.transfer;

import com.gabriel.stage.entity.Car;
import com.gabriel.stage.vo.CarVO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;

import java.util.List;

/**
 * @author: Gabriel
 * @date: 2020/3/11 23:33
 * @description Car 实体->VO 转换器
 */
@Mapper
public interface CarVOTransfer {

    CarVOTransfer INSTANCE = Mappers.getMapper(CarVOTransfer.class);

    /**
     * 实体对象->vo对象
     * @param car
     * @return
     */
    CarVO entityToVO(Car car);


    /**
     * 实体集合->vo集合
     * @param carList
     * @return
     */
    List<CarVO> entityListToVOList(List<Car> carList);
}

    Entity对象

package com.gabriel.stage.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.math.BigDecimal;

/**
 * @author: Gabriel
 * @date: 2020/1/28 19:21
 * @description 实体类-- Car
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Car {

    /** 指定自增id */
    private Integer id;

    /** 名称 */
    private String name;

    /**  品牌 */
    private String brand;

    /** 价格 */
    private BigDecimal price;
}

    VO对象

package com.gabriel.stage.vo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.math.BigDecimal;

/**
 * @author: Gabriel
 * @date: 2020/3/11 23:37
 * @description
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class CarVO {

    /** 指定自增id */
    private Integer id;

    /** 名称 */
    private String name;

    /**  品牌 */
    private String brand;

}

  测试类

package com.gabriel.stage.vo;

import com.gabriel.stage.entity.Car;
import com.gabriel.stage.vo.transfer.CarVOTransfer;
import com.google.common.collect.Lists;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

/**
 * @author: Gabriel
 * @date: 2020/3/12 0:00
 * @description 测试类
 */
public class TestTransfer {
    public static void main(String[] args) {
        //转换对象
        Car car = Car.builder().name("奔驰S600").brand("奔驰").id(1).price(new BigDecimal(9999.99)).build();

        CarVO carVO = CarVOTransfer.INSTANCE.entityToVO(car);

        System.out.println("MapStruct转换对象"+carVO);

        System.out.println("=======================华丽的分割线===================");
        
        //转换集合
        List<Car> carList = Lists.newArrayList(car);

        List<CarVO> carVOList = CarVOTransfer.INSTANCE.entityListToVOList(carList);

        System.out.println("MapStruct转换集合"+carVOList);


    }
}

  结果如图
  

猜你喜欢

转载自www.cnblogs.com/gabriel-y/p/12466626.html