推薦一款 Java 對(duì)象映射神器!
點(diǎn)擊上方“JAVA”,星標(biāo)公眾號(hào)

前言
調(diào)用getter/setter方法進(jìn)行屬性賦值 調(diào)用BeanUtil.copyPropertie進(jìn)行反射屬性賦值
第一種方式不必說(shuō),屬性多了就需要寫一大坨getter/setter代碼。第二種方式比第一種方式要簡(jiǎn)便很多,但是坑巨多,比如sources與target寫反,難以定位某個(gè)字段在哪里進(jìn)行的賦值,同時(shí)因?yàn)橛玫椒瓷洌瑢?dǎo)致性能也不佳。
準(zhǔn)備工作
@Data
@Accessors(chain = true)
public?class?User {
????private?Long id;
????private?String?username;
????private?String?password;
????private?Integer sex;
????private?LocalDate birthday;
????private?LocalDateTime createTime;
????private?String?config;
????private?String?test;
}
@Data
@Accessors(chain = true)
public?class?UserVo {
????private?Long id;
????private?String?username;
????private?String?password;
????private?Integer gender;
????private?LocalDate birthday;
????private?String?createTime;
????private?List config;
????private?String?test;
????@Data
????public?static?class?UserConfig {
????????private?String?field1;
????????private?Integer field2;
????}
} 一、MapStruct 配置以及基礎(chǔ)使用
<dependency>
??<groupId>org.mapstructgroupId>
??<artifactId>mapstructartifactId>
??<version>1.3.1.Finalversion>
dependency>
<dependency>
??<groupId>org.mapstructgroupId>
??<artifactId>mapstruct-processorartifactId>
??<version>1.3.1.Finalversion>
dependency>@MapperConfig
public interface BaseMapping {
????/**
?????* 映射同名屬性
?????*/
????@Mapping(target?= "createTime", dateFormat = "yyyy-MM-dd HH:mm:ss")
????TARGET sourceToTarget(SOURCE var1);
????/**
?????* 反向,映射同名屬性
?????*/
????@InheritInverseConfiguration(name?= "sourceToTarget")
????SOURCE targetToSource(TARGET var1);
????/**
?????* 映射同名屬性,集合形式
?????*/
????@InheritConfiguration(name?= "sourceToTarget")
????List sourceToTarget(List var1);
????/**
?????* 反向,映射同名屬性,集合形式
?????*/
????@InheritConfiguration(name?= "targetToSource")
????List targetToSource(List var1);
????/**
?????* 映射同名屬性,集合流形式
?????*/
????List<TARGET> sourceToTarget(Stream<SOURCE> stream);
????/**
?????* 反向,映射同名屬性,集合流形式
?????*/
????List<SOURCE> targetToSource(Stream<TARGET> stream);
} import?org.mapstruct.Mapper;
import?org.mapstruct.Mapping;
@Mapper(componentModel = "spring")
public?interface?UserMapping?extends?BaseMapping<User, UserVo> {
????@Mapping(target = "gender", source = "sex")
????@Mapping(target = "createTime", dateFormat = "yyyy-MM-dd HH:mm:ss")
????@Override
????UserVo sourceToTarget(User var1);
????@Mapping(target = "sex", source = "gender")
????@Mapping(target = "password", ignore = true)
????@Mapping(target = "createTime", dateFormat = "yyyy-MM-dd HH:mm:ss")
????@Override
????User targetToSource(UserVo var1);
????default?List strConfigToListUserConfig(String config)? {
????????return?JSON.parseArray(config, UserConfig.class);
????}
????default?String listUserConfigToStrConfig(List list) ?{
????????return?JSON.toJSONString(list);
????}
}二、自定義屬性類型轉(zhuǎn)換方法
default?List strConfigToListUserConfig(String config) {
??return?JSON.parseArray(config, UserConfig.class);
}
default?String listUserConfigToStrConfig(List list) {
??return?JSON.toJSONString(list);
} 三、單元測(cè)試
@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest
public?class?MapStructTest?{
??@Resource
??private?UserMapping userMapping;
??@Test
??public?void?tetDomain2DTO()?{
????User user = new?User()
??????.setId(1L)
??????.setUsername("zhangsan")
??????.setSex(1)
??????.setPassword("abc123")
??????.setCreateTime(LocalDateTime.now())
??????.setBirthday(LocalDate.of(1999, 9, 27))
??????.setConfig("[{\"field1\":\"Test Field1\",\"field2\":500}]");
????UserVo userVo = userMapping.sourceToTarget(user);
????log.info("User: {}", user);
????
????log.info("UserVo: {}", userVo);
????
??}
??@Test
??public?void?testDTO2Domain()?{
????UserConfig userConfig = new?UserConfig();
????userConfig.setField1("Test Field1");
????userConfig.setField2(500);
????UserVo userVo = new?UserVo()
??????.setId(1L)
??????.setUsername("zhangsan")
??????.setGender(2)
??????.setCreateTime("2020-01-18 15:32:54")
??????.setBirthday(LocalDate.of(1999, 9, 27))
??????.setConfig(Collections.singletonList(userConfig));
????User user = userMapping.targetToSource(userVo);
????log.info("UserVo: {}", userVo);
????
????log.info("User: {}", user);
????
??}四、常見(jiàn)問(wèn)題
代碼下載
參考
https://mapstruct.org/documentation/stable/reference/html/
https://mapstruct.org/faq/
https://github.com/mapstruct/mapstruct-examples
http://www.kailing.pub/MapStruct1.3/index.html
https://www.cnblogs.com/javaguide/p/11861749.html
最近熬夜給大家準(zhǔn)備了515套Java代碼,有一些是業(yè)務(wù)類的小項(xiàng)目,比如Java博客項(xiàng)目,也有腳手架、也有平時(shí)用一些的工具類、21套小程序代碼,也有一些游戲類的項(xiàng)目。
掃以下二維碼并回復(fù)“828”即可獲取
或者在本公眾號(hào)對(duì)話框回復(fù)【828】馬上獲取
評(píng)論
圖片
表情

