MapStructs

本文详细介绍了MapStruct的使用,包括依赖引入、基础使用、注解使用等。通过示例展示了如何进行对象属性的映射、忽略、类型转换以及自定义转换方法。同时,还涵盖了List类型的转换以及多对一的转换场景。MapStruct通过注解简化了Java对象间的转换,提高了代码的可读性和维护性。
摘要由CSDN通过智能技术生成

API

MapStruct Documentation

依赖引入

<mapstruct.version>1.3.1.Final</mapstruct.version>

<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct</artifactId>
    <version>${mapstruct.version}</version>
</dependency>
<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct-processor</artifactId>
    <version>${mapstruct.version}</version>
</dependency>

基础使用

  1. 接口创建
  1. @Mapper注解将该接口注册为转换器
  1. 创建INSTENCE
  1. 创建需要转换的接口方法

@Mapper
public interface MapStructsConverter {

    MapStructsConverter INSTENCE = Mappers.getMapper(MapStructsConverter.class);

    NameCopy name2Copy(Name name);
}


@Generated(
    value = "org.mapstruct.ap.MappingProcessor",
    date = "2022-03-30T21:23:01+0800",
    comments = "version: 1.3.1.Final, compiler: javac, environment: Java 1.8.0_311 (Oracle Corporation)"
)
public class MapStructsConverterImpl implements MapStructsConverter {

    @Override
    public NameCopy name2Copy(Name name) {
        if ( name == null ) {
            return null;
        }

        NameCopy nameCopy = new NameCopy();

        nameCopy.setLast( name.getLast() );
        nameCopy.setFullName( name.getFullName() );

        nameCopy.setFirstName( name.getFirst() + "name" );

        return nameCopy;
    }
}
 

以上操作可以将A类对象a,将类型相同变量名相同的变量进行映射,获取b对象。

注解使用

@Mapping

同类型不同名

@Mapping(target = "firstName", source = "first")
NameCopy name2Copy(Name name);

忽略

@Mapping(target = "firstName", ignore = true)
NameCopy name2Copy(Name name);

类型不同

不能直接映射,需要自定义处理之后再映射

expression

@Mapping(target = "firstName", expression = "java(name.getFirst() + \"name\")")
NameCopy name2Copy(Name name);

qulifiedByName

@Mapping(target = "last", source = "last", qualifiedByName = "formatDoubleDef")
NameCopy name2Copy(Name name);


@Named("formatDoubleDef")
default Name formatDouble(String source) {
    return new Name().setLast(source);
}

当两个类型不同的变量不能直接进行映射时,mapStucts会进行默认的映射,比如有StringInteger之间的转换。当默认的转换不足以将两个变量进行映射时,可以通过创建自定义方法来进行处理并加注解@Named,通过qualifiedByName指定对应的方法进行处理。

不同类型的默认转换

NameCopy name2Copy(Name name);

@Mapping(target = "last", expression = "java(last)")
Name sting2Name(String last);

接口中定义的default方法需要通过qualifiedByName进行指定;

而接口中定义的接口方法则可直接进行转换,不需要进行指定。但是当,存在多个方法的时候必须指定使用哪一个方法。

@Mapping(target = "last", expression = "java(this.sting2Name(name.getLast()))")
NameCopy name2Copy(Name name);

@Mapping(target = "last", expression = "java(last)")
Name sting2Name(String last);

@Mapping(target = "last", expression = "java(last + \"123\")")
Name sting2Name1(String last);

List之间的转换

在List转换时,直接通过通过泛型,将源list进行遍历,调用target泛型和destination泛型的转换方法。将源list一个一个转换成target list。因此在进行list之间的转换的基础是泛型指定的类型之间的转换。

假如直接将原本应该写在泛型所指的方法上,则这些注解可能会因为版本的问题失效。

 @Mapping(target = "firstName", expression = "java(name.getFirst() + \"name\")")
    @Mapping(target = "last", expression = "java(this.sting2Name(name.getLast()))")
    NameCopy name2Copy(Name name);
	NameCopy name2Copy1(Name name);

    List<NameCopy> names2Copy(List<Name> names);

@Override
public NameCopy name2Copy(Name name) {
    if ( name == null ) {
        return null;
    }

    NameCopy nameCopy = new NameCopy();

    nameCopy.setFullName( name.getFullName() );

    nameCopy.setLast( this.sting2Name(name.getLast()) );
    nameCopy.setFirstName( name.getFirst() + "name" );

    return nameCopy;
}

@Override
public List<NameCopy> names2Copy(List<Name> names) {
    if ( names == null ) {
        return null;
    }

    List<NameCopy> list = new ArrayList<NameCopy>( names.size() );
    for ( Name name : names ) {
        list.add( name2Copy( name ) );
    }

    return list;
}

为List转换指定方法进行

@Named("123")
@Mapping(target = "firstName", expression = "java(name.getFirst() + \"name\")")
@Mapping(target = "last1", source = "last1", qualifiedByName = "formatDoubleDef", defaultValue = "123")
@Mapping(target = "last", expression = "java(this.sting2Name(name.getLast()))")
NameCopy name2Copy(Name name);

@IterableMapping(qualifiedByName = "123")
List<NameCopy> names2Copy(List<Name> names);

default value

source 默认值

@Mapping(target = "firstName", expression = "java(name.getFirst() + \"name\")")
@Mapping(target = "last1", source = "last1", qualifiedByName = "formatDoubleDef", defaultValue = "123")
@Mapping(target = "last", expression = "java(this.sting2Name(name.getLast()))")
NameCopy name2Copy(Name name);

@Override
public NameCopy name2Copy(Name name) {
    if ( name == null ) {
        return null;
    }

    NameCopy nameCopy = new NameCopy();

    if ( name.getLast1() != null ) {
        nameCopy.setLast1( formatDouble( name.getLast1() ) );
    }
    else {
        nameCopy.setLast1( formatDouble( "123" ) );
    }
    nameCopy.setFullName( name.getFullName() );

    nameCopy.setFirstName( name.getFirst() + "name" );
    nameCopy.setLast( this.sting2Name(name.getLast()) );

    return nameCopy;
}

@Override
public List<NameCopy> names2Copy(List<Name> names) {
    if ( names == null ) {
        return null;
    }

    List<NameCopy> list = new ArrayList<NameCopy>( names.size() );
    for ( Name name : names ) {
        list.add( name2Copy( name ) );
    }

    return list;
}
@Override
public NameCopy name2Copy(Name name) {
    if ( name == null ) {
        return null;
    }

    NameCopy nameCopy = new NameCopy();

    if ( name.getLast1() != null ) {
        nameCopy.setLast1( formatDouble( name.getLast1() ) );
    }
    else {
        nameCopy.setLast1( formatDouble( "123" ) );
    }
    nameCopy.setFullName( name.getFullName() );

    nameCopy.setFirstName( name.getFirst() + "name" );
    nameCopy.setLast( this.sting2Name(name.getLast()) );

    return nameCopy;
}

constant

对指定的变量进行常量赋值。

@Mapping(target = "last1", constant = "last")
@Mapping(target = "firstName", source = "first", defaultValue = "undefined")
@Mapping(target = "last", expression = "java(this.sting2Name(name.getLast()))")
NameCopy name2Copy2(Name name);

@Override
public NameCopy name2Copy2(Name name) {
    if ( name == null ) {
        return null;
    }

    NameCopy nameCopy = new NameCopy();

    if ( name.getFirst() != null ) {
        nameCopy.setFirstName( name.getFirst() );
    }
    else {
        nameCopy.setFirstName( "undefined" );
    }
    nameCopy.setFullName( name.getFullName() );

    nameCopy.setLast1( "last" );
    nameCopy.setLast( this.sting2Name(name.getLast()) );

    return nameCopy;
}

多对一的转换

多转一的时候,当变量类型与变量名相同的变量同时存在源对象中,需要进行指定。

@Mapping(target = "fullName", source = "name1.fullName")
@Mapping(target = "last1", source = "name1.last1")
@Mapping(target = "last", expression = "java(this.sting2Name(name1.getLast()))")
@Mapping(target = "firstName", source = "name2.first")
NameCopy name2Copy(Name name1, Name name2);

@Override
public NameCopy name2Copy(Name name1, Name name2) {
    if ( name1 == null && name2 == null ) {
        return null;
    }

    NameCopy nameCopy = new NameCopy();

    if ( name1 != null ) {
        nameCopy.setFullName( name1.getFullName() );
        nameCopy.setLast1( name1.getLast1() );
    }
    if ( name2 != null ) {
        nameCopy.setFirstName( name2.getFirst() );
    }
    nameCopy.setLast( this.sting2Name(name1.getLast()) );

    return nameCopy;
}

@MappingTarget

当目标对象为主动传入,而不是返回新的对象。

@Mapping(target = "last", expression = "java(this.sting2Name(name.getLast()))")
void name2Copy(Name name, @MappingTarget NameCopy nameCopy);

@Override
public void name2Copy(Name name, NameCopy nameCopy) {
    if ( name == null ) {
        return;
    }

    nameCopy.setLast1( name.getLast1() );
    nameCopy.setFullName( name.getFullName() );

    nameCopy.setLast( this.sting2Name(name.getLast()) );
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

别说小李

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值