mapstruct使用

2021-06-29  本文已影响0人  程序男保姆

增驾依赖

     <dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct-jdk8</artifactId>
            <version>1.3.1.Final</version>
        </dependency>
        <dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct-processor</artifactId>
            <version>1.3.1.Final</version>
        </dependency>

<plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>8</source>
                    <target>8</target>
                    <encoding>UTF-8</encoding>
                    <annotationProcessorPaths>
                        <path>
                            <groupId>org.mapstruct</groupId>
                            <artifactId>mapstruct-processor</artifactId>
                            <version>1.3.1.Final</version>
                        </path>
                        <path>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                            <version>1.18.12</version>
                        </path>
                    </annotationProcessorPaths>
                </configuration>
            </plugin>


package com.example.mapstruct;

import java.util.List;
import org.mapstruct.InheritConfiguration;
import org.mapstruct.InheritInverseConfiguration;
import org.mapstruct.MapperConfig;
import org.mapstruct.Mappings;

/***
 *
 * @Mapper 只有在接口加上这个注解, MapStruct 才会去实现该接口
 *     @Mapper 里有个 componentModel 属性,主要是指定实现类的类型,一般用到两个
 *     default:默认,可以通过 Mappers.getMapper(Class) 方式获取实例对象
 *     spring:在接口的实现类上自动添加注解 @Component,可通过 @Autowired 方式注入
 * @Mapping:属性映射,若源对象属性与目标对象名字一致,会自动映射对应属性
 *     source:源属性
 *     target:目标属性
 *     dateFormat:String 到 Date 日期之间相互转换,通过 SimpleDateFormat,该值为 SimpleDateFormat              的日期格式
 *     ignore: 忽略这个字段
 * @Mappings:配置多个@Mapping
 * @MappingTarget 用于更新已有对象
 * @InheritConfiguration 用于继承配置

 *
 * @param <Source>
 * @param <Target>
 */
@MapperConfig
public interface BaseMapping<Source, Target> {
    @Mappings({})
    @InheritConfiguration
    Target to(Source var1);

    @InheritConfiguration
    List<Target> to(List<Source> var1);

    @InheritInverseConfiguration
    Source from(Target var1);

    @InheritInverseConfiguration
    List<Source> from(List<Target> var1);
}

package com.example.mapstruct;

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

import java.util.List;

@Mapper
public interface PersonConverter extends BaseMapping<PersonDTO,Person>{
    PersonConverter INSTANCE = Mappers.getMapper(PersonConverter.class);

//    @Mappings({
//             @Mapping(source = "birthday", target = "birth"),
////            @Mapping(source = "birthday", target = "birthDateFormat", dateFormat = "yyyy-MM-dd HH:mm:ss"),
////            @Mapping(target = "birthExpressionFormat", expression = "java(DateFormatUtils.format(person.getBirthday(),\"yyyy-MM-dd HH:mm:ss\"))"),
//            @Mapping(source = "user.age", target = "age"),
//            @Mapping(target = "email", ignore = true)
//    })
//    PersonDTO domain2dto(Person person);
//
//    List<PersonDTO> domain2dto(List<Person> people);
}

package com.example.mapstruct;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Date;

@NoArgsConstructor
@AllArgsConstructor
@Data
public class Person {
    private Long id;
    private String name;
    private String email;
    private Date birthday;
    private User user;
}


package com.example.mapstruct;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;

import java.util.Date;

@NoArgsConstructor
@AllArgsConstructor
@Data
@Accessors(chain = true)

public class PersonDTO {
    private Long id;
    private String name;
    /**
     * 对应 Person.user.age
     */
    private Integer age;
    private String email;
    /**
     * 与 DO 里面的字段名称(birthDay)不一致
     */
    private Date birth;
    /**
     * 对 DO 里面的字段(birthDay)进行拓展,dateFormat 的形式
     */
    private String birthDateFormat;
    /**
     * 对 DO 里面的字段(birthDay)进行拓展,expression 的形式
     */
    private String birthExpressionFormat;

} 

package com.example.mapstruct;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@NoArgsConstructor
@AllArgsConstructor
@Data
public class User {
    private Integer age;
}

package com.example.mapstruct;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class PersonConverterTest {

    public static void main(String[] args) {
        Person person = new Person(1L,"zhige","zhige.me@gmail.com",new Date(),new User(1));
//        PersonDTO personDTO = PersonConverter.INSTANCE.domain2dto(person);
//
//        List<Person> people = new ArrayList<>();
//        people.add(person);
//        List<PersonDTO> personDTOs = PersonConverter.INSTANCE.domain2dto(people);
//

        PersonDTO personDTO1 = PersonConverter.INSTANCE.from(person);


        System.out.println(12);


    }

}
上一篇 下一篇

猜你喜欢

热点阅读