实体与DTO之间的转换
1.导言
在代码的开发中我们经常碰见实体的返回值远比需要展示的数据多,我们能通过实体之间快速的进行赋值的操作
2.转换的方式
2.1 将实体之间的转换提出为公共方法
@Data
public class Entity{
private String title;
private String link;
private String fileRoute;
private String sourceChannel;
private String publishDate;
private String titleId;
private String wellId;
public static EntityDTO toDTO(Entity entity) {
EntityDTO entityDTO= new EntityDTO ();
entityDTO.setTitle(titleLinkReqDTO.getTitle());
entityDTO.setLink(titleLinkReqDTO.getLink());
entityDTO.setFileRoute(titleLinkReqDTO.getFileRoute());
entityDTO.setSourceChannel(titleLinkReqDTO.getSource());
entityDTO.setPublishDate(titleLinkReqDTO.getReleaseTime());
return entityDTO;
}
上述方式是提前将实体之间的转换写出后续那里需要直接调用方法就可以,无需进行重复的赋值工作,但是在你需要将一个实体转换为多个不同的DTO时也需要进行多次的进行这个操作
2.2使用注解
//第二个参数的意思为 自动忽略未映射数据
@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface LaunchConverter {
//例1 自动将你的数据进行转换
UserDto toUserDto(User user);
//如果你的实体与DTO之间的字段名并不完全对应
//可以通过@Mapping这个方法来指定你的数据来源字段与数据目标字段
@Mapping(source = "phone",target = "phoneDto")
UserDto toUserDto(User user);
//他也可以进行多个字段的源数据与目标数据的对应
@Mappings({
@Mapping(source = "id",target = "idDto"),
@Mapping(source = "name",target = "nameDto"),
@Mapping(source = "phone",target = "phoneDto")
})
UserDto toUserDto(User user);
//此外@Mapping方法也可以指定单个或多个目标数据无需转换
@Mapping(source = "name",ignore = true)
UserDto toUserDto(User user);
//还可以在转换时对数据进行处理
@Mapping(source = "time", target = "time",dateFormat = "yyyy-MM-dd HH:mm:ss")
UserDto toUserDto(User user);
//constant中的值为无论对应的字段是否有值都使用默认值
@Mapping(target = "userName", constant = "yby")
//source中的值如果为空则会使用defaultValue中的值 而不会全部使用
@Mapping(target = "modelColor", source = "modelColor", defaultValue = "标致")
UserDto toUserDto(User user);
}