**1. 两个存在字段类型不一致的实体类**
```java
@Data
public class Flight {
private String flightId;
private String flightName;
private String createTime;
}
@Data
public class FlightDto {
private String flightDtoId;
private String flightDtoName;
private LocalDateTime createTime;
}
```
**2. 映射接口**
```java
//imports将表达式用到的相关类导入到当前类中
@Mapper(imports = {DateUtils.class, UUID.class})
public interface FlightMapper {
FlightMapper INSTANCE = Mappers.getMapper(FlightMapper.class);
//flightDtoId取值为表达式expression的返回值
@Mapping(target = "flightDtoId", expression = "java(UUID.randomUUID().toString())")
//当flightName为null时,flightDtoName取值为defaultExpression的返回值
@Mapping(source = "flightName", target = "flightDtoName", defaultExpression = "java(UUID.randomUUID().toString())")
//当类型不一致时可以使用expression表达式进行转换
@Mapping(target = "createTime", expression = "java(DateUtils.strToLocalDateTime(source.getCreateTime()))")
FlightDto toDto(Flight source);
//如果不使用imports属性,则需要在表达式中写全名
//@Mapping(, expression="java(java.util.UUID.randomUUID().toString())")
}
```
我定义的`DateUtils.strToLocalDateTime(...)`方法如下:
```java
public class DateUtils {
public static LocalDateTime strToLocalDateTime(String str) {
DateTimeFormatter df = DateTimeFormatter.ofPattern("yyy-MM-dd HH:mm:ss");
return LocalDateTime.parse(str, df);
}
}
```
**3. 测试**
```java
@Test
public void testFlightMapper() {
Flight flight = new Flight();
flight.setFlightId("10001");
flight.setFlightName(null );
flight.setCreateTime("2021-10-21 10:38:29");
FlightDto flightDto = FlightMapper.INSTANCE.toDto(flight);
//Flight:Flight(flightId=10001, flightName=null, createTime=2021-10-21 10:38:29)
System.out.println("Flight:" + flight);
//FlightDto:FlightDto(flightDtoId=48c367e7-..., flightDtoName=2bc3454e-..., createTime=2021-10-21T10:38:29)
System.out.println("FlightDto:" + flightDto);
}
```
**4. 查看映射接口被Mapstruct编译后的代码**
```java
public class FlightMapperImpl implements FlightMapper {
public FlightMapperImpl() {
}
public FlightDto toDto(Flight source) {
if (source == null) {
return null;
} else {
FlightDto flightDto = new FlightDto();
if (source.getFlightName() != null) {
flightDto.setFlightDtoName(source.getFlightName());
} else {
flightDto.setFlightDtoName(UUID.randomUUID().toString());
}
flightDto.setFlightDtoId(UUID.randomUUID().toString());
flightDto.setCreateTime(DateUtils.strToLocalDateTime(source.getCreateTime()));
return flightDto;
}
}
}
```
- MapStruct属性映射
- MapStruct是什么
- maven依赖
- 基本映射
- 字段名不一致的映射
- 字段类型不一致的映射
- 基本数据类型转换
- 日期格式转换
- 使用表达式转换
- 枚举映射
- 多个源类的映射
- 集合的映射
- 添加自定义映射方法
- 映射前后
- 添加默认值
- 映射异常处理
- SpringDataJPA
- SpringDataJPA是什么
- 与JPA、Hibernate的关系
- 环境搭建
- 简单CURD操作
- 内部原理
- 主键生成策略
- 联合主键
- 查询方式
- 方法命名规则查询
- 限制查询结果查询
- 注解@Query查询
- 命名参数查询
- SpEL表达式查询
- 原生查询
- 更新与删除
- Specification动态查询
- 核心接口
- 查询例子
- 分页查询与排序
- 多表查询
- 一对一查询
- 一对多查询
- 多对多查询
- 注意事项
- Specification多表查询
- @Query多表查询
- 只查询指定字段
- 级联操作
- 加载规则