**1. 兩個字段數量不同的枚舉類**
```java
public enum Dog {
XIAOHUANG,
DAHUANG,
DOG_1,
DOG_2,
DOG_3,
}
public enum DogDto {
XIAOHUANG,
DAHUANG,
DOG_DTO,
}
```
**2. 映射接口**
```java
@Mapper
public interface DogMapper {
DogMapper INSTANCE = Mappers.getMapper(DogMapper.class);
/**
* 1)兩個枚舉類的屬性名相同時會自動映射,不需要顯示處理。
* 2)DOG_1、DOG_2、DOG_3都可以映射到DOG_DTO。
*/
@ValueMapping(source = "DOG_1", target = "DOG_DTO")
@ValueMapping(source = "DOG_2", target = "DOG_DTO")
@ValueMapping(source = "DOG_3", target = "DOG_DTO")
DogDto toDto(Dog source);
/**
* MappingConstants.ANY_REMAINING 可以讓source剩余的未匹配的屬性都可以映射到DOG_DTO
*/
@ValueMapping(source = MappingConstants.ANY_REMAINING, target = "DOG_DTO")
DogDto toDto2(Dog source);
/**
* MappingConstants.ANY_UNMAPPED 可以讓source未使用@ValueMapping(source="..",)明確指定的
* 屬性都可以映射到DOG_DTO。
*/
@ValueMapping(source = MappingConstants.ANY_UNMAPPED, target = "DOG_DTO")
DogDto toDto3(Dog source);
}
```
**3. 測試**
```java
@Test
public void testDogMapper() {
DogDto dogDto = DogMapper.INSTANCE.toDto(Dog.XIAOHUANG);
DogDto dogDto1 = DogMapper.INSTANCE.toDto(Dog.DOG_1);
DogDto dogDto2 = DogMapper.INSTANCE.toDto2(Dog.DOG_1);
DogDto dogDto3 = DogMapper.INSTANCE.toDto3(Dog.DAHUANG);
System.out.println("dogDto:" + dogDto); //dogDto:XIAOHUANG
System.out.println("dogDto1:" + dogDto1);//dogDto1:DOG_DTO
System.out.println("dogDto2:" + dogDto2);//dogDto2:DOG_DTO
System.out.println("dogDto3:" + dogDto3);//dogDto3:DOG_DTO
}
```
**4. 查看映射接口被Mapstruct編譯后的代碼**
```java
public class DogMapperImpl implements DogMapper {
public DogMapperImpl() {
}
public DogDto toDto(Dog source) {
if (source == null) {
return null;
} else {
DogDto dogDto;
switch(source) {
case DOG_1:
dogDto = DogDto.DOG_DTO;
break;
case DOG_2:
dogDto = DogDto.DOG_DTO;
break;
case DOG_3:
dogDto = DogDto.DOG_DTO;
break;
case XIAOHUANG:
dogDto = DogDto.XIAOHUANG;
break;
case DAHUANG:
dogDto = DogDto.DAHUANG;
break;
default:
throw new IllegalArgumentException("Unexpected enum constant: " + source);
}
return dogDto;
}
}
public DogDto toDto2(Dog source) {
if (source == null) {
return null;
} else {
DogDto dogDto;
switch(source) {
case XIAOHUANG:
dogDto = DogDto.XIAOHUANG;
break;
case DAHUANG:
dogDto = DogDto.DAHUANG;
break;
default:
dogDto = DogDto.DOG_DTO;
}
return dogDto;
}
}
public DogDto toDto3(Dog source) {
if (source == null) {
return null;
} else {
switch(source) {
default:
DogDto dogDto = DogDto.DOG_DTO;
return dogDto;
}
}
}
}
```
- MapStruct屬性映射
- MapStruct是什么
- maven依賴
- 基本映射
- 字段名不一致的映射
- 字段類型不一致的映射
- 基本數據類型轉換
- 日期格式轉換
- 使用表達式轉換
- 枚舉映射
- 多個源類的映射
- 集合的映射
- 添加自定義映射方法
- 映射前后
- 添加默認值
- 映射異常處理
- SpringDataJPA
- SpringDataJPA是什么
- 與JPA、Hibernate的關系
- 環境搭建
- 簡單CURD操作
- 內部原理
- 主鍵生成策略
- 聯合主鍵
- 查詢方式
- 方法命名規則查詢
- 限制查詢結果查詢
- 注解@Query查詢
- 命名參數查詢
- SpEL表達式查詢
- 原生查詢
- 更新與刪除
- Specification動態查詢
- 核心接口
- 查詢例子
- 分頁查詢與排序
- 多表查詢
- 一對一查詢
- 一對多查詢
- 多對多查詢
- 注意事項
- Specification多表查詢
- @Query多表查詢
- 只查詢指定字段
- 級聯操作
- 加載規則