• 【工具库】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);
    
    
        }
    }

      结果如图
      

  • 相关阅读:
    智能指针之 auto_ptr
    UML在线绘图
    inline使用
    工作随笔—2017-12-12
    链表排序
    转——浅谈如何提高服务器并发处理能力
    使用re开发python计算器
    Linux-centos7下python3 环境设置
    C语言中的static 详细分析
    pycharm import pygame 出现报错:No module named 'pygame'
  • 原文地址:https://www.cnblogs.com/july-sunny/p/12466626.html
Copyright © 2020-2023  润新知