数据实体转换MapStruct常用点

简介: MapStruct

在代码开发过程中,大型系统进行微服务化拆分,各个核心模块也会进行必要的业务代码分层,层与层之间参数传导过程中,各参数实体对像的属性传递等也变得越来越重要,这个过程中,大量的套路式代码get/set等也会出现在属性传递过程中,mapstruct即为解决这部分套路式代码提供了良好的解决方案,实际使用过程中,定议基于target/source的接口,同时添加不同属性名的映射,即可在编译过程中自动生成对应的实现,极大的简化了操作

 

MAVEN依赖

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

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

 

 

测试Demo

测试目录结构


 

基本对像

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class School {
    private String schoolName; 
    private Student st;
} 
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
  public class Student {
    private String name; 
    private int age;
  }
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
  public class SchoolDO {
    private String schoolName;
    private StudentDO stNew;
  }
 
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
  public class StudentDO {
    private String name;
    private int newAge;
  }

 

 

通用方式-1

使用基础的泛型接口,实际接口直接继承泛型接口使用

l  字段属性名一致情况下无需再额外定义转换函数

l  如有字段属性名不一致,仅需重载单条记录的转换函数,同时添加map映射source/target的属性名

l  Eg: StudentConvert, 仅一个简单接口即实现了数据的转换,属性名也作了映射

public interface BasicMapper<SOURCE, TARGET> {
    /**
     * @Mappings({
     * @Mapping(source = "code", target = "newCode"),
     * @Mapping(source = "name", target = "newName")
     * })
     */
    @Mappings({})
    @InheritConfiguration
    TARGET to(SOURCE source);  

    @InheritConfiguration
    List<TARGET> to(Collection<SOURCE> source);  
   
@InheritInverseConfiguration     SOURCE from(TARGET source);
   
@InheritInverseConfiguration     List<SOURCE> from(Collection<TARGET> source); }
 
@Component
@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface StudentConvert extends BasicMapper<Student, StudentDO>{
    
@Mappings({      @Mapping(source = "age", target = "newAge")      })      StudentDO to(Student source); } 
public static void main(String[] args) {
    SpringApplication.run(StructTest.class, args);
    ApplicationContext context = SpringUtil.getApplicationContext();
    StudentConvert stConvert = context.getBean(StudentConvert.class);
    /**
 * 实际转换中直接可单条或是多条list记录,并且有属性名不一致也可以
 * mapper接口中指定
 */
    Student st = Student.builder().name("student").age(18).build();
    Student st2 = Student.builder().name("student2").age(180).build();
    List<Student> stList = Lists.newArrayList(st, st2); 
    List<StudentDO> stDos = stConvert.to(stList);
    System.out.println(stDos.toString());
}
 

 


 

 

通用方式-2

嵌套转换

l  对像本身要作属性的映射转换

l  对像内某些属性也需作属生的映射转换

定议外层的映射接口,在接口中直接指定该属性对像的转换类,如下School对像中的student属性也要作相应的属性转换,可接口中直接指定 uses = {StudentConvert.class}:

@Component
@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE, uses = {StudentConvert.class})
public interface SchoolConvert {      @Mappings({          @Mapping(source = "st", target = "stNew")      })      SchoolDO to(School source); }
 
@SpringBootApplication
  public class StructTest { 
   
public static void main(String[] args) {         SpringApplication.run(StructTest.class, args);         ApplicationContext context = SpringUtil.getApplicationContext();    
       
//demo 2         SchoolConvert schoolConvert = context.getBean(SchoolConvert.class);
       
School school = School.builder().schoolName("school-1").st(st).build();
       
SchoolDO schDO = schoolConvert.to(school);
       
System.out.println(schDO);
   
}
}
 

 

 

 

 

通用方式-3

l  Source对像中的属性对像中的属性转target属性

l  target对像中的属性对像中的属性转source属性

l  表达式取值(枚举类/常量)

l  调用自定义函数取值映射

 

@Mappings(
        @Mapping(source = "orderItem.discountInfo", target = "discountInfo")
)
ItemDetailDto order2itemdetail(OrderBaseDto orderBaseDto);
 @Mappings({
       
@Mapping(target = "materialId",source = "giftDetail.materialId")})
DemoDto command2ToDto(DemoCommand demoCommand);
 
@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE,
imports = {TypeEnum.class})
public interface CampaignInputConvert {
  
    @Mappings({         
           
@Mapping(target ="giftType",expression = "java(TypeEnum.ITEM_NO.code()"),                     
           
@Mapping(target = "media",expression = "java(CommonConsts.SEND_MEDIA)")         
    })
   
GiftDemoBaseDto goodsDetailToGiftRpc(GoodsDemoOutput goodsDemoOutput, CustDemoOutput custDemoOutput, CustDemoDO custDemoDO);
 
@Component
@Mapper
(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface DemoInfoConvert {
   
List<DemoInfo> discntInfoDtoList2DemoInfoList(List<DemoInfoDto> demoInfoDtos);
   
@Mappings({
      
@Mapping(target = "discountValue", expression = "java(getDemotValue(discntInfoDto))")
    })
   
CouponInfo dto2output(DiscntInfoDto discntInfoDto);
    default
Long getDemoValue(DemoInfoDto demoInfoDto) {
       
if (discntInfoDto.getDiscountValue() != null) {
           
return discntInfoDto.getDiscountValue();
       
} else {
           
return discntInfoDto.getReduceValue();
       
}
    }
}

 

 

相关文章
|
SQL 缓存 Java
Hibernate对象状态之间的神奇转换
Hibernate对象状态之间的神奇转换
|
Java Maven 开发工具
【mapstruct】Java 中 mapstruct mapper 转换器部分字段转换无效的解决方案
【mapstruct】Java 中 mapstruct mapper 转换器部分字段转换无效的解决方案
745 0
|
JSON Java Apache
Bean自动映射工具对比及VO、DTO、PO、DO对象之间的转换
在实际的开发过程中,常常遇到各个层之间对象转换,比如 VO、DTO、PO、DO 等,而如果都是手动set、get,一旦属性较多时,操作起来不仅麻烦,而且浪费时间,因此经常会使用一些工具类,进行对象之间的转换,下面将对象与对象之间转换的方式进行对比,一级对象间的使用进行总结。
Bean自动映射工具对比及VO、DTO、PO、DO对象之间的转换
|
fastjson 前端开发
巧用fastjson自定义序列化类实现字段的转换
项目中突然需要增加另一个字段的查找,而这个查找需要查另一张表的记录。 但现在产品很多地方都要增加该字段,如何最快的实现该功能呢。 办法如下: 通过fastjson序列化时,增加该字段的序列化类,该序列化类通过CODE查找名称,并序列化到前端。
5820 0
|
4月前
|
Java 数据库连接 数据库
Hibernate 支持哪些不同类型的关系?
【8月更文挑战第21天】
34 0
|
安全 Java Maven
使用MapStruct简化Java对象映射
在软件开发中,经常需要将一个Java对象的数据映射到另一个对象,特别是在使用DTO(Data Transfer Object)模式时。手动编写这些映射代码非常繁琐,而MapStruct可以帮助我们自动生成这些映射代码,从而提高开发效率和代码质量。
275 2
|
Java 数据格式 XML
使用dozer实现对象转换
Dozer的github地址:https://github.com/DozerMapper/dozer Dozer的官方文档:http://dozer.sourceforge.net/ 什么是DozerDozer是一个JavaBean映射工具库。
1401 0
|
开发框架 安全 搜索推荐
使用MapStruct自动化转换实体
``MapStruct``是一种类型安全的``bean映射``类生成java注释处理器。 我们要做的就是定义一个映射器接口,声明任何必需的映射方法。在编译的过程中,``MapStruct``会生成此接口的实现。该实现使用纯java方法调用的源和目标对象之间的映射,``MapStruct``节省了时间,通过生成代码完成繁琐和容易出错的代码逻辑。下面我们来揭开它的神秘面纱
|
XML JSON Java
Java对象或集合数据与JSON格式数据之间的转换
对比主流JSON库,熟悉FastJson应用场景
3095 1
 Java对象或集合数据与JSON格式数据之间的转换