PO DTO VO 例子(使用mapstruct)
PO DTO VO 例子(使用mapstruct)
简单解释:
PO:对应数据库数据,一一对应。
DTO:service传输数据,对PO的进一步封装,为了适应业务,可以是对个PO。
VO:视图实体,与前端交互,接收前端或者返回前端数据的实体,隐藏一些不必显示的字段。
一、添加依赖
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-jdk8</artifactId>
<version>1.2.0.Final</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.2.0.Final</version>
</dependency>
二、依赖中添加插件(正常运行可不加)
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.4</version>
</path>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.2.0.Final</version>
</path>
</annotationProcessorPaths>
<compilerArgs>
<compilerArg>
-Amapstruct.defaultComponentModel=spring
</compilerArg>
<compilerArg>
-Amapstruct.unmappedTargetPolicy=WARN
</compilerArg>
</compilerArgs>
</configuration>
</plugin>
三、创建实体类
1、创建PO对象
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ScArticle implements Serializable {
/**
* 文章id
*/
private Integer id;
/**
* 新闻编号
*/
private String code;
/**
* 文章标题
*/
private String title;
/**
* 文章内容
*/
private String content;
private static final long serialVersionUID = 1L;
}
2、创建VO对象
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ScArtileVO {
/**
* 新闻编号
*/
private String code;
/**
* 文章标题
*/
private String title;
private static final long serialVersionUID = 1L;
}
此处DTO传输对象与PO对象一样,因此直接演示PO转化VO。主要演示mapstruct。
四、创建转化接口
@Mapper(componentModel = "spring") //spring容器管理
public interface ScArticleConvert {
ScArtileVO scArticleToScArticleVo(ScArticle scArticle);
}
五、调用转化方法
public BaseResponse getArticleContext(String code) {
//先PO对象
ScArticle articleContext = scArticleMapper.getArticleContext(code);
//将PO对象转化为VO
ScArtileVO scArtileVO = scArticleConvert.scArticleToScArticleVo(articleContext);
return BaseResponse.buildSuccess(scArtileVO);
}
注:如果是PO --> DTO --> VO 对象之间转化,尤其是DTO转化可能存在多个PO对象,列表等,在此举例接口方法说明:
@Mapper(componentModel = "spring")
public interface ScArticleConvert {
//PO转化VO
ScArtileVO scArticleToScArticleVo(ScArticle scArticle);
//注解标签的使用
@Mappings({@Mapping(target = "id", ignore = true)})
ScArtileVO scArticleToScArticleVo(ScArticle scArticle);
//列表转化
List<ScArtileVO> scArticleToScArticleVo(List<ScArticle> scArticle)
//数据格式化举例子
@Mappings({@Mapping(source = "salary", target = "salary", numberFormat = "¥#.00", dateFormat = "¥0.00")})
ScArtileVO scArticleToScArticleVo(ScArticle scArticle);
//反转转化 VO -> PO
@InheritInverseConfiguration(name = "scArticleToScArticleVo")
ScArticle scArticleVOToScArticle(ScArtileVO scArtileVO);
}
通过方法转化
@Mappings({
@Mapping(source = "queuedRequest", target = "queuedRequest", qualifiedByName = "booleanToIntCovert", defaultValue = "0"),
@Mapping(source = "canCalculation", target = "canCalculation", qualifiedByName = "booleanToIntCovert", defaultValue = "0"),
@Mapping(source = "distributeFresh", target = "distributeFresh", qualifiedByName = "booleanToIntCovert", defaultValue = "0") })
FOTAEcuFlagJson toFOTAEcuFlagJson(EcuFlagJson ecuFlagJson);
@Named("booleanToIntCovert")
default int booleanToIntCovert(boolean name) {
if (name) {
return 1;
} else {
return 0;
}
}
表达式。注意: 这个属性不能与source()、defaultValue()、defaultExpression()、qualifiedBy()、qualifiedByName()或constant()一起使用。
@Mapping(target = "describe", source = "describe", defaultValue = "默认值")
@Mapping(target = "createTime",expression = "java(new java.util.Date())")
PersonDTO conver(Person person);
如果属性从字符串映射到日期,则该格式字符串可由SimpleDateFormat处理,反之亦然。当映射枚举常量时,将忽略所有其他属性类型。
@Mapping(target = "createTime" ,source = "createTime", dateFormat = "yyyy-MM-dd")
PersonDTO conver(Person person);
使用numberFormat()之后DecimalFormat格式转换,还是会抛出NFE
异常
@Mapping(target = "age",source = "age", numberFormat = "#0.00")
PersonDTO conver(Person person);
posted on 2022-03-08 12:50 Chase_Hanky 阅读(331) 评论(0) 编辑 收藏 举报