在项目中,我们经常会用到VO
、DTO
、PO
等等对象之间的相互转换
。
可用的工具有BeanUtils
、MapStruct
等。BeanUtils
是傻瓜式的很死板。
今天记录下MapStruct
的简单用法
。
关注博主不迷路,获取更多干货资源

1 官网
https://mapstruct.org/
可以给idea装个插件MapStruct Support
,这样会有一些提示
2 POM
| <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.22</version> </dependency> <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct</artifactId> <version>1.4.2.Final</version> </dependency> <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-processor</artifactId> <version>1.4.2.Final</version> </dependency>
|
3 单个源
3.1 定义实体
定义了好几个实体,我就截个图吧,方便对比,代码可以去github
拉
https://github.com/xiaoma55/CODE_MapStruct

3.2 定义接口
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
| @Mapper(componentModel = "spring") public interface ICarMapper {
@Mapping(source = "totalPrice", target = "totalPrice", numberFormat = "#.00" ,defaultValue = "¥0.00") @Mapping(source = "publishDate", target = "publishDate", dateFormat = "yyyy-MM-dd HH:mm:ss") @Mapping(target = "color", ignore = true) @Mapping(source = "brand", target = "brandName") @Mapping(source = "driverDTO", target = "driverVO") CarVO carDTO2CarVO(CarDTO carDTO);
List<CarVO> carDTOs2carVOs(List<CarDTO> carDTO);
@Mapping(source = "id", target = "driverId") @Mapping(source = "name", target = "fullName") DriverVO driverDTO2DriverVO(DriverDTO driverDTO);
@AfterMapping default void dto2voAfter(CarDTO carDTO, @MappingTarget CarVO carVO) { List<PartDTO> partDTOS = carDTO.getPartDTOS(); boolean hasPart = partDTOS != null && !partDTOS.isEmpty(); carVO.setHasPart(hasPart); }
@BeanMapping(ignoreByDefault = true) @Mapping(source = "id", target = "id") @Mapping(source = "brand", target = "brandName") VehicleVO carDTO2vehicleVO(CarDTO carDTO);
@InheritConfiguration(name = "carDTO2vehicleVO") void updateVehicleVO(CarDTO carDTO, @MappingTarget VehicleVO vehicleVO);
@BeanMapping(ignoreByDefault = true) @InheritInverseConfiguration(name = "carDTO2vehicleVO") CarDTO vehicleVO2CarDTO(VehicleVO vehicleVO); }
|
3.3 测试
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
| @SpringBootTest public class MapStructTest { @Autowired private ICarMapper carMapper;
@Test public void test5() { VehicleVO vehicleVO = new VehicleVO() .setId(9999L) .setBrandName("别克") .setPrice(66554322d); CarDTO carDTO = carMapper.vehicleVO2CarDTO(vehicleVO); System.out.println(carDTO); }
@Test public void test4() { CarDTO carDTO = buildCarDTO(); VehicleVO vehicleVO = carMapper.carDTO2vehicleVO(carDTO).setPrice(888d); CarDTO carDTO2 = new CarDTO() .setId(330L) .setPrice(789d) .setBrand("迈巴赫"); carMapper.updateVehicleVO(carDTO2, vehicleVO); System.out.println(vehicleVO); }
@Test public void test3() { CarDTO carDTO = buildCarDTO(); VehicleVO vehicleVO = carMapper.carDTO2vehicleVO(carDTO); System.out.println(vehicleVO); }
@Test public void test2() { CarDTO carDTO1 = buildCarDTO(); CarDTO carDTO2 = new CarDTO().setId(1L); List<CarDTO> carDTOList = Arrays.asList(carDTO1, carDTO2); List<CarVO> carVOList = carMapper.carDTOs2carVOs(carDTOList); System.out.println(carVOList); }
@Test public void test1() { CarDTO carDTO = buildCarDTO(); CarVO carVO = carMapper.carDTO2CarVO(carDTO); System.out.println(carDTO); System.out.println(carVO); }
private CarDTO buildCarDTO() { DriverDTO driverDTO = new DriverDTO() .setId(88L) .setName("小明"); PartDTO partDTO1 = new PartDTO() .setPartId(1L) .setPartName("多功能方向盘"); PartDTO partDTO2 = new PartDTO() .setPartId(2L) .setPartName("智能车门"); CarDTO carDTO = new CarDTO() .setId(330L) .setVin("vin123456789") .setPrice(123789.126d) .setTotalPrice(143789.126d) .setPublishDate(new Date()) .setColor("白色") .setBrand("大众") .setDriverDTO(driverDTO) .setPartDTOS(Arrays.asList(partDTO1, partDTO2)); return carDTO; } }
|
4 多个源
4.1 定义实体
定义了好几个实体,我就截个图吧,方便对比,代码可以去github
拉
https://github.com/xiaoma55/CODE_MapStruct

4.2 定义接口
| @Mapper(componentModel = "spring") public interface IDeliveryAddressMapper { @Mapping(source = "customer.firstName", target = "forename") @Mapping(source = "customer.lastName", target = "surname") @Mapping(source = "address.street", target = "street") @Mapping(source = "address.postalcode", target = "postalcode") @Mapping(source = "address.county", target = "county") DeliveryAddress from(Customer customer, Address address); }
|
4.3 测试
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| @SpringBootTest public class MultiSourceTest { @Autowired private IDeliveryAddressMapper deliveryAddressMapper;
@Test public void test1() { Customer customer = new Customer() .setFirstName("张") .setLastName("三"); Address homeAddress = new Address() .setStreet("科技二路") .setCounty("雁塔区") .setPostalcode("89123"); DeliveryAddress deliveryAddress = deliveryAddressMapper.from(customer, homeAddress); System.out.println(deliveryAddress); } }
|
Finally 躺板板
红伞伞白杆杆,吃完一起躺板板
躺板板埋山山,亲朋都来吃饭饭
饭饭里有红伞伞,吃完全村埋山山,来年长满红伞伞
关注博主不迷路
