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