一.什么是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); } }
結果如圖