PO自动转换为DTO(mapstruct-解决手动转换)

前序:

之前为了规范化,从数据库查询出来之后,有些属性不需要传递,需要定义与之对应的DTO,可能有时候DTO中与PO中的属性名称还不一样的情况,这个时候就不能使用BeanUtils.copy了,而且每次查询每次都要写一个BeanUtils.copy,可能还有的公司并不相信BeanUtils.copy(这里包括全部公司的copy,apache、spring、cglib等),认为会有问题(我之前公司有个开发就不用,全是手动转换DTO,具体什么问题我也没遇到…),这里多说一句,BeanUtils.copy性能最快的是cglib的,本人亲测过,手动调用setXxx方法最慢,有兴趣的可以看我另外一篇博客:
java拷贝对象属性的几种方式对比
最近突然发现有一个框架,可以实现这种繁琐的操作,不需要自己转来转去,而且可以重复使用,就是mapstruct这个框架,你只需要简单的创建一个接口类,配个注解,再写个转换接口方法就可以了,简直不能再舒服了。

第一步、导依赖

		<!--包含一些核心的注解-->
 		<dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct</artifactId>
            <version>1.3.0.Final</version>
        </dependency>
        <!--负责生成接口的实现类-->
        <dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct-processor</artifactId>
            <version>1.3.0.Final</version>
            <scope>compile</scope>
        </dependency>

第二步、定义2个测试类

package com.example.demo.mapstruct;

import lombok.Data;

/**
 * @Author: Lee
 * @Date: 2020/5/13
 * @Description:
 **/
@Data
public class Car {

    private String make;
    private int numberOfSeats;
    private CarType type;

    //constructor, getters, setters etc.
    static enum CarType {
        SEDAN

    }
}
package com.example.demo.mapstruct;

import lombok.Data;

/**
 * @Author: Lee
 * @Date: 2020/5/13
 * @Description:
 **/
@Data
public class CarDTO {

    private String make;
    private int seatCount;
    private String type;
}

第三步、创建接口

package com.example.demo.mapstruct;

import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;
import org.mapstruct.factory.Mappers;

/**
 * @Author: Lee
 * @Date: 2020/5/13
 * @Description:
 **/
@Mapper
public interface CarTransfer {

    /**
     * 定义个变量,用于获取CarTransfer接口的实现,格式固定如下:
     */
    CarTransfer INSTANCE = Mappers.getMapper(CarTransfer.class);

    /**
     * 当2个类中的字段名不一致时,可以 @Mapping注解来解决,
     * source代表源对象中的类,target代表目标
     */
    @Mappings(@Mapping(source = "numberOfSeats", target = "seatCount"))
    CarDTO toCarDTO(Car car);

}

第四步、验证

package com.example.demo.mapstruct;

/**
 * @Author: Lee
 * @Date: 2020/5/13
 * @Description:
 **/
public class Test1 {
    public static void main(String[] args) {
        Car car = new Car();
        car.setMake("car");
        car.setNumberOfSeats(1);
        car.setType(Car.CarType.SEDAN);

        CarDTO carDTO = CarTransfer.INSTANCE.toCarDTO(car);
        System.out.println(carDTO);
    }
}

结果如下:
在这里插入图片描述
总结:

是不是很方便,用了之后,你就会发现很舒服的,而且会自动对不同的字段类型进行转换,依赖的版本可以自己选择。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

技术武器库

一句真诚的谢谢,胜过千言万语

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值