Java中MapStruct使用方法解析

 更新时间:2023年10月21日 08:30:59   作者:jjavaboy  
这篇文章主要介绍了Java中MapStruct使用方法解析,接受请求参数都会使用一个vo类,这个vo类里封装了所有需要接受的参数,然后对参数进行业务逻辑处理,处理完后会持久化处理, 使用MapStruct可以快速帮你解决转换工作,需要的朋友可以参考下

MapStruct使用方法

一般java web开发的程序员,都有一个共同的体会,接受请求参数都会使用一个vo类,这个vo类里封装了所有需要接受的参数,然后对参数进行业务逻辑处理,处理完后会持久化处理,通常每个业务表都会对应一个bean类,然后就需要将vo对象转化为bean对象再持久化,这个过程中,就需要new bean对象,给bean对象里的每个属性赋值;请求处理完,还需要有返回,通常返回也会封装一个vo类,所以也需要new一个vo对象,将需要返回的数据封装在这个vo对象里,这个是比较麻烦的。

使用MapStruct可以快速帮你解决vo->bean,bean->vo的转换工作,使得代码更加简洁。

这里使用JDK8,idea来编写程序,maven解决依赖,先在pom文件引入依赖:

<properties>
    <org.mapstruct.version>1.2.0.Final</org.mapstruct.version>
</properties>
<!-- 省略其他.. -->
 
<dependencies>
  	<dependency>
        <groupId>org.mapstruct</groupId>
        <artifactId>mapstruct-jdk8</artifactId>
        <version>${org.mapstruct.version}</version>
    </dependency>
      <dependency>
          <groupId>org.mapstruct</groupId>
          <artifactId>mapstruct-processor</artifactId>
          <version>${org.mapstruct.version}</version>
      </dependency>
</dependencies>
 
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.5.1</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
                <annotationProcessorPaths>
                    <path>
                        <groupId>org.mapstruct</groupId>
                        <artifactId>mapstruct-processor</artifactId>
                        <version>${org.mapstruct.version}</version>
                    </path>
                </annotationProcessorPaths>
            </configuration>
        </plugin>
    </plugins>
</build>

下面看java代码,先定义一个接口或者抽象类

@Mapper
public interface CarMapper {
	
	CarMapper INSTANCE = Mappers.getMapper(CarMapper.class);
	
	CarDto carToCarDto(Car car);
 
	@Mappings({
			@Mapping(source = "numberOfSeats", target = "seatCount")
	})
	CarDto carToCarDtoSpecial(Car car);
}
 
public class Car {
	
    private String make;
    private int numberOfSeats;
    private CarType type;
    private Date createTime;
    
    //getter and setter...
}
 
public class CarDto {
	
	private String make;
    private int seatCount;
    private String type;
 
    private String date;
    
    //getter and setter...
}

首先我们看mapstruct生成carToCarDto方法

public CarDto carToCarDto(Car car) {
        if ( car == null ) {
            return null;
        }
 
        CarDto carDto = new CarDto();
 
        carDto.setMake( car.getMake() );
        if ( car.getType() != null ) {
            carDto.setType( car.getType().name() );
        }
 
        return carDto;
    }

按照默认情况来说,mapstruct是根据两个对象里相同名称的属性名来进行赋值的,上面可以看出Car和CarDto有make和type两个属性名称是相同的,所以会将Car对象的两个属性值分别赋值给CarDto对象,当然也可以根据指定的属性来进行赋值。

carToCarDtoSpecial方法就是可以解决上面这个问题的,下面是mapstruct生成的源码

public CarDto carToCarDtoSpecial(Car car) {
        if ( car == null ) {
            return null;
        }
 
        CarDto carDto = new CarDto();
 
        carDto.setSeatCount( car.getNumberOfSeats() ); //A处
        carDto.setMake( car.getMake() );
        if ( car.getType() != null ) {
            carDto.setType( car.getType().name() );
        }
 
        return carDto;
    }

源码多了A处,因为我们指定了注解

@Mapping(source = "numberOfSeats", target = "seatCount")

就是告诉mapstruct,Car的numberOfSeats属性值映射到CarDto的seatCount的属性值。

使用mapstruct来转换Car和CarDto是非常简单的

CarDto carDto = CarMapper.INSTANCE.carToCarDto(car);
		
 
CarDto carDto1 = CarMapper.INSTANCE.carToCarDtoSpecial(car);

所以就两行代码就针对两种情况,使用非常简洁。

上面只是一个Car对象转换到一个CarDto,mapstruct还可以将多个对象作为入参,转换到一个返回对象里。

到此这篇关于Java中MapStruct使用方法解析的文章就介绍到这了,更多相关MapStruct的使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java RabbitMQ高级特性详细分析

    Java RabbitMQ高级特性详细分析

    为了保证消息的可靠性传输,包括投递消息的生产方能投递成功,和消息消费的消费方正确消费,RabbitMQ 提供了两个确认机制,由于消息按照流通的顺序从左到右,因此为保证可靠性,MQ必须对 Producer进行确认,Consumer 必须对 MQ 进行确认
    2022-08-08
  • java对于JSON的解析方法举例详解

    java对于JSON的解析方法举例详解

    在编写应用时,我们经常要解析JSON,下面这篇文章主要给大家介绍了关于java对于JSON的解析方法,文中通过代码示例介绍的非常详细,需要的朋友可以参考下
    2023-09-09
  • Spring Boot集成netty实现客户端服务端交互示例详解

    Spring Boot集成netty实现客户端服务端交互示例详解

    这篇文章主要给大家介绍了关于Spring Boot集成netty实现客户端服务端交互的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-12-12
  • Java中遍历集合的并发修改异常解决方案实例代码

    Java中遍历集合的并发修改异常解决方案实例代码

    当你遍历集合的同时,又往集合中添加或者删除元素,就可能报并发修改异常,下面这篇文章主要给大家介绍了关于Java中遍历集合的并发修改异常解决方案的相关资料,需要的朋友可以参考下
    2022-12-12
  • Java设计模式七大原则之单一职责原则详解

    Java设计模式七大原则之单一职责原则详解

    单一职责原则(Single Responsibility Principle, SRP),有且仅有一个原因引起类的变更。简单来说,就是针对一个java类,它应该只负责一项职责。本文将详细介绍一下Java设计模式七大原则之一的单一职责原则,需要的可以参考一下
    2022-02-02
  • MyBatis typeHandler接口的定义和使用

    MyBatis typeHandler接口的定义和使用

    TypeHandler被称作类型处理器,MyBatis在设置预处理语句中的参数或从结果集中取出一个值时,都会用类型处理器将Java对象转化为数据库支持的类型或者将获取到数据库值以合适的方式转换成Java类型,感兴趣的同学可以参考下文
    2023-05-05
  • macOS中搭建Java8开发环境(基于Intel x86 64-bit)

    macOS中搭建Java8开发环境(基于Intel x86 64-bit)

    这篇文章主要介绍了macOS中搭建Java8开发环境(基于Intel x86 64-bit) 的相关资料,需要的朋友可以参考下
    2022-12-12
  • java 解压与压缩文件夹的实例详解

    java 解压与压缩文件夹的实例详解

    这篇文章主要介绍了 java 解压与压缩文件夹的实例详解的相关资料,希望通过本文能帮助到大家,让大家实现这样的功能,掌握这样的方法,需要的朋友可以参考下
    2017-10-10
  • Java concurrency线程池之线程池原理(二)_动力节点Java学院整理

    Java concurrency线程池之线程池原理(二)_动力节点Java学院整理

    这篇文章主要为大家详细介绍了Java concurrency线程池之线程池原理第二篇,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • Java两个乒乓球队比赛名单问题(判断素数)

    Java两个乒乓球队比赛名单问题(判断素数)

    两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单
    2017-02-02

最新评论