MapStruct进行对象转换

平时开发中会遇到各自对象之间的转换,之前需要自己写大量的set、get方法去进行转换赋值,使用MapStruct可以替代传统的get和set方法的转换,并且效率相当,省去了手写转换方法的过程,一定程度上提高了开发效率。

1.引入依赖

   <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>
        </dependency>

2.需要转换的对象及目标对象结构

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class PersonDto {

    private String userName;

    private String phone;

    private String type;

    private List<CarDto> cars;
}
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class CarDto {

    private String brandName;

    private String price;

    private String color;
}

-----------目标对象-------------------
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class Person {

    private String name;

    private String phone;

    private String nationality;

    private String userType;

    private List<Car> carList;
}
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class Car {

    private String brand;

    private String price;

    private String color;
}

3.编写转换器

常用的场景见例子中:

@Mapper
public interface PersonConverter {

    //将原对象中每个属性值映射到目标对象的属性上,同名称会自动映射
    @Mapping(target = "name", source = "userName")
    //将目标对象中每个熟悉统一设置为一个常量
    @Mapping(target = "nationality", constant = "China")
    //映射某个值,并设置当原属性为空时的默认值
    @Mapping(target = "userType", source = "type",defaultValue = "普通用户")
    @Mapping(target = "carList", source = "cars")
    Person personDto2Person(PersonDto personDto);

    @Mapping(target = "brand", source = "brandName")
    Car carDto2Car(CarDto carDto);
}

4.构建项目生成对应的实现类

@Generated(
    value = "org.mapstruct.ap.MappingProcessor",
    date = "2022-09-02T09:54:11+0800",
    comments = "version: 1.3.0.Final, compiler: javac, environment: Java 1.8.0_131 (Oracle Corporation)"
)
public class PersonConverterImpl implements PersonConverter {

    @Override
    public Person personDto2Person(PersonDto personDto) {
        if ( personDto == null ) {
            return null;
        }

        PersonBuilder person = Person.builder();

        person.name( personDto.getUserName() );
        if ( personDto.getType() != null ) {
            person.userType( personDto.getType() );
        } else {
            person.userType( "普通用户" );
        }
        person.carList( carDtoListToCarList( personDto.getCars() ) );
        person.phone( personDto.getPhone() );

        person.nationality( "China" );

        return person.build();
    }

    @Override
    public Car carDto2Car(CarDto carDto) {
        if ( carDto == null ) {
            return null;
        }

        CarBuilder car = Car.builder();

        car.brand( carDto.getBrandName() );
        car.price( carDto.getPrice() );
        car.color( carDto.getColor() );

        return car.build();
    }

    protected List<Car> carDtoListToCarList(List<CarDto> list) {
        if ( list == null ) {
            return null;
        }

        List<Car> list1 = new ArrayList<Car>( list.size() );
        for ( CarDto carDto : list ) {
            list1.add( carDto2Car( carDto ) );
        }

        return list1;
    }
}

生成规则:
1.当原属性与其目标实体对应的名称相同时,它将被隐式映射。
2.当原属性在目标实体中具有不同的名称时,通过@Mapping注释指定其名称映射关系。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MapStruct是一个Java注解处理器,用于生成类型安全的映射代码。它可以帮助我们在不同的Java对象之间进行映射转换,包括List对象。 在MapStruct中,我们可以使用@Mapper注解来标记一个接口或者抽象类作为映射器。然后,我们可以定义映射方法来指定如何将一个对象映射到另一个对象。 对于List对象的映射,我们可以使用@Mapping注解来指定列表中每个元素的映射规则。例如,我们可以使用@Mapping(source = "sourceList", target = "targetList")来指定源列表和目标列表之间的映射关系。 下面是一个示例代码,展示了如何在MapStruct中映射List对象: ```java @Mapper public interface MyMapper { MyMapper INSTANCE = Mappers.getMapper(MyMapper.class); @Mapping(source = "sourceList", target = "targetList") TargetObject map(SourceObject source); List<TargetObject> mapList(List<SourceObject> sourceList); } ``` 在上面的代码中,我们定义了一个名为MyMapper的映射器接口。通过使用@Mapper注解,我们告诉MapStruct生成相应的映射代码。 然后,我们定义了两个映射方法:map和mapList。map方法用于将单个SourceObject对象映射到TargetObject对象,而mapList方法用于将整个List<SourceObject>映射到List<TargetObject>。 使用MapStruct时,我们可以通过调用MyMapper.INSTANCE.map(source)来执行映射操作。同样地,我们可以通过调用MyMapper.INSTANCE.mapList(sourceList)来执行列表的映射操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值