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编辑  收藏  举报