




















如果有两个两个实体对象,想把一个对象的字段值赋值给另一个对象。可以通过set/get方法直接设置,不过这样很多模板代码。太多了,不能很好的突出业务,我们主要精力还是要放在业务上。
可以通过spring的beanutil.copyproperities方法,设置对象字段值。不过这个有一些不是很好的地方
1.是通过反射实现的,虽然反射经过了一系列优化。速度和编译后的字节码直接调用,差距不是很大,应该还是要慢一些。我没有实际验证过
2.好像必须要类型、字段名,相同才能直接复制。如果字段名不相同,就不会复制,不够灵活
使用mapconstruct
1. 可以通过编译,直接赋值,不用反射。基于注解处理器,在编译的时候。生成mapper接口实现类,实现对象的赋值
2.可以指定源对象的字段,目标字段
下面是官网的一个demo,在本地跑了下,注意和lombok冲突,执行顺序。在跑官网demo的使用,觉得有两个地方比较好
1. 可以在pom定义变量,比如依赖的版本,可以在多个地方引用。类似代码重复常量,不使用硬编码,使用常量定义
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<lombok.version>1.18.20</lombok.version>
<mapstruct.version>1.2.0.Final</mapstruct.version>
</properties>
2.我们做测试,可能会在main方法写测试逻辑。main方法只有一个,只能写一个测试逻辑。我们可以使用单元测试,写多个测试逻辑。也可以不断沉淀,积累
public class CarMapperTest { @Test public void shouldMapCarToDto() { //given Car car = new Car( "Morris", 5); //when CarDto carDto = CarMapper.INSTANCE.carToCarDto( car ); //then System.out.println(carDto); } }
public class StudentMapperTest { @Test public void test() { Student student = new Student(10, "zhangsan"); StudentVo studentVo = StudentMapper.INSTANCE.studentVoToStudentVo(student); System.out.println(studentVo); } }
官网demo
package com.gxf.po; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; /** * @author guanxiangfei * @version 1.0.0 * @since 2026/4/18 */ //@AllArgsConstructor //@NoArgsConstructor //@Data public class Car { private String make; private int numberOfSeats; // private CarType type; //constructor, getters, setters etc. public Car() { } public Car(String make, int numberOfSeats) { this.make = make; this.numberOfSeats = numberOfSeats; } public String getMake() { return make; } public void setMake(String make) { this.make = make; } public int getNumberOfSeats() { return numberOfSeats; } public void setNumberOfSeats(int numberOfSeats) { this.numberOfSeats = numberOfSeats; } @Override public String toString() { return "Car{" + "make='" + make + '\'' + ", numberOfSeats=" + numberOfSeats + '}'; } }
package com.gxf.dto; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; /** * @author guanxiangfei * @version 1.0.0 * @since 2026/4/18 */ //@AllArgsConstructor //@NoArgsConstructor //@Data public class CarDto { private String make; private int seatCount; private String type; //constructor, getters, setters etc. public CarDto() { } public CarDto(String make, int seatCount, String type) { this.make = make; this.seatCount = seatCount; this.type = type; } public String getMake() { return make; } public void setMake(String make) { this.make = make; } public int getSeatCount() { return seatCount; } public void setSeatCount(int seatCount) { this.seatCount = seatCount; } public String getType() { return type; } public void setType(String type) { this.type = type; } @Override public String toString() { return "CarDto{" + "make='" + make + '\'' + ", seatCount=" + seatCount + ", type='" + type + '\'' + '}'; } }
package com.gxf.mapper; /** * @author guanxiangfei * @version 1.0.0 * @since 2026/4/18 */ import com.gxf.dto.CarDto; import com.gxf.po.Car; import org.mapstruct.Mapper; import org.mapstruct.Mapping; import org.mapstruct.factory.Mappers; @Mapper public interface CarMapper { CarMapper INSTANCE = Mappers.getMapper( CarMapper.class ); @Mapping(source = "numberOfSeats", target = "seatCount") CarDto carToCarDto(Car car); }
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。