Java 实体映射工具 MapStruct

  作者:记性不好的阁主


版权声明:本文为CSDN博主「志哥谈笑间」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/zhige_me/article/details/80699784



maven依赖引入方式


<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.5</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.laoxu</groupId>
<artifactId>map-struct-demo</artifactId>
<version>1.0</version>
<name>mapstructdemo</name>
<description>mapstructdemo</description>
<properties>
<java.version>1.8</java.version>
<mapstruct.version>1.2.0.Final</mapstruct.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

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

<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>

</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<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.2.0.Final</version>
</path>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
</plugins>
</build>


</project>


注意:maven插件中的mapstruct-processor版本号一定要跟依赖中的mapstruct-processor版本号一致,否则报错


1、定义Person类和User类


package com.laoxu.mapstructdemo.DO;

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.laoxu.mapstructdemo.DO;


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

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


2、定义一个映射接收的dto类


package com.laoxu.mapstructdemo.dto;

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

import java.util.Date;

@NoArgsConstructor
@AllArgsConstructor
@Data
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;

}


3、定义一个日期转换工具类


package com.laoxu.mapstructdemo.util;

import java.text.SimpleDateFormat;
import java.util.Date;

public class DateUtils {

public static String dateToString(Date date) {
return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date);
}
}


4、定义关键的转换映射接口


package com.laoxu.mapstructdemo.convert;

import com.laoxu.mapstructdemo.DO.Person;
import com.laoxu.mapstructdemo.dto.PersonDTO;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;
import org.mapstruct.factory.Mappers;

import java.util.List;

@Mapper(componentModel = "spring")
public interface PersonConverter {
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(com.laoxu.mapstructdemo.util.DateUtils.dateToString(person.getBirthday()))"),
@Mapping(source = "user.age", target = "age"),
@Mapping(target = "email", ignore = true)
})
PersonDTO domain2dto(Person person);

List<PersonDTO> domain2dto(List<Person> people);
}


  • source为接口方法参数对象中的属性
  • target为接口返回对象中的属性
  • expression返回对象中根据表达式中的方法转换后的属性



5、在springboot项目中启动测试


package com.laoxu.mapstructdemo;

import com.laoxu.mapstructdemo.DO.Person;
import com.laoxu.mapstructdemo.DO.User;
import com.laoxu.mapstructdemo.convert.PersonConverter;
import com.laoxu.mapstructdemo.dto.PersonDTO;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;

@SpringBootApplication
public class MapstructdemoApplication {

public static void main(String[] args) {
SpringApplication.run(MapstructdemoApplication.class, args);
Person person = new Person(1L,"zhige","zhige.me@gmail.com",new Date(),new User(1));
PersonDTO personDTO = PersonConverter.INSTANCE.domain2dto(person);
System.out.println(personDTO);
System.out.println(Objects.equals(personDTO.getId(), person.getId()));
System.out.println(Objects.equals(personDTO.getName(), person.getName()));
System.out.println(Objects.equals(personDTO.getBirth(), person.getBirthday()));
String format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(personDTO.getBirth());
System.out.println(Objects.equals(personDTO.getBirthDateFormat(),format));
System.out.println(Objects.equals(personDTO.getBirthExpressionFormat(),format));

List<Person> people = new ArrayList<>();
people.add(person);
List<PersonDTO> personDTOs = PersonConverter.INSTANCE.domain2dto(people);
System.out.println(personDTOs);
}

}



6、查看结果


PersonDTO(id=1, name=zhige, age=1, email=null, birth=Fri Oct 08 11:01:48 CST 2021, birthDateFormat=2021-10-08 11:01:48, birthExpressionFormat=2021-10-08 11:01:48)
true
true
true
true
true
[PersonDTO(id=1, name=zhige, age=1, email=null, birth=Fri Oct 08 11:01:48 CST 2021, birthDateFormat=2021-10-08 11:01:48, birthExpressionFormat=2021-10-08 11:01:48)]




相关推荐

评论 抢沙发

表情

分类选择