【工具庫】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);


    }
}

  結果如圖
  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM