首页 > 其他分享 >MapStruct笔记

MapStruct笔记

时间:2024-11-11 14:41:25浏览次数:1  
标签:String MapStruct private User source 笔记 public name

依赖包

<dependency>
    <groupId>org.mapstruct</groupId>
    <!-- jdk8以下就使用mapstruct -->
    <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>

使用

数据准备

// 实体类
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class User {
    private Integer id;
    private String name;
    private String createTime;
    private LocalDateTime updateTime;
}
 
// 被映射类VO1:和实体类一模一样
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class UserVO1 {
    private Integer id;
    private String name;
    private String createTime;
    private LocalDateTime updateTime;
}
 
// 被映射类VO1:比实体类少一个字段
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class UserVO2 {
    private Integer id;
    private String name;
    private String createTime;
 
}

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class UserVO3 {
    private String id;
    private String name;
    // 实体类该属性是String
    private LocalDateTime createTime;
    // 实体类该属性是LocalDateTime
    private String updateTime;
}

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class UserVO4 {
    // 实体类该属性名是id
    private String userId;
    // 实体类该属性名是name
    private String userName;
    private String createTime;
    private String updateTime;
}

普通转换

@Mapper(componentModel = "spring")
public interface UserCovertBasic {
    UserCovertBasic INSTANCE = Mappers.getMapper(UserCovertBasic.class);
 
    /**
     * 字段数量类型数量相同,利用工具BeanUtils也可以实现类似效果
     * @param source
     * @return
     */
    UserVO1 toConvertVO1(User source);

    User fromConvertEntity1(UserVO1 userVO1);
 
    /**
     * 字段数量类型相同,数量少:仅能让多的转换成少的,故没有fromConvertEntity2
     * @param source
     * @return
     */
    UserVO2 toConvertVO2(User source);
}

转换一个集合

    List<UserVO1> toConvertVOList(List<User> source);

复杂转换

    // 方式一:调用自定义方法(见下方)
    @Mappings({
            @Mapping(target = "createTime", expression = "java(com.java.mmzsblog.util.DateTransform.strToDate(source.getCreateTime()))"),
    })
    UserVO3 toConvertVO3(User source);
 
    User fromConvertEntity3(UserVO3 userVO3);

    // 方式二:调用提供的dateFormat 方法
    @Mappings({
            @Mapping(target = "createTime", dateFormat = "yyyy-MM-dd HH:mm:ss"),
    })
    UserVO3 toConvertVO3_1(User source);

    // 字段名不一致
    @Mappings({
            @Mapping(source = "id", target = "userId"),
            @Mapping(source = "name", target = "userName")
    })
    UserVO4 toConvertVO(User source);
    
    User fromConvertEntity4(UserVO4 userVO4);

上面 expression 指定的表达式内容如下:

public class DateTransform {
    public static LocalDateTime strToDate(String str){
        DateTimeFormatter df = DateTimeFormatter.ofPattern("yyy-MM-dd HH:mm:ss");
        return LocalDateTime.parse("2018-01-12 17:07:05",df);
    }
 
}

小结

1、基本类型及其他们对应的包装类型。
此时 mapstruct 会自动进行拆装箱。不需要人为的处理
2、基本类型的包装类型和string类型之间

当字段名不一致时,通过使用 @Mappings 注解指定对应关系,编译后即可实现对应字段的赋值。

属性是枚举类型:默认取的是基础的枚举的name属性

// 编译后:
    public UserVO5 convertEnum(UserEnum userEnum) {
        if (userEnum == null) {
            return null;
        } else {
            UserVO5.UserVO5Builder userVO5 = UserVO5.builder();
            if (userEnum.getUserTypeEnum() != null) {
                userVO5.type(userEnum.getUserTypeEnum().name());
            }

            userVO5.id(userEnum.getId());
            userVO5.name(userEnum.getName());
            return userVO5.build();
        }
    }

// 取的是"Java","DB","LINUX"
@Getter
@AllArgsConstructor
public enum UserTypeEnum {
    Java("000", "Java?????"),
    DB("001", "??????"),
    LINUX("002", "Linux???");

    private String value;
    private String title;

}

标签:String,MapStruct,private,User,source,笔记,public,name
From: https://www.cnblogs.com/lzghyh/p/18539658

相关文章

  • 【论文笔记】基于不完整数据的鲁棒多模态情感分析
    背景在现实世界的多模态情感检测中,由于存在大量的不完整的数据,影响了模型在判断情感时的准确性和鲁棒性,为了解决这一问题,本文提出了一个出了一种新颖的网络结构——Language-dominatedNoise-resistantLearningNetwork(LNLN),旨在解决数据不完整性问题,在MSA中语言模态通常包......
  • 点云学习笔记14——PCL点云文件投影到平面
    #include<iostream>#include<pcl/io/pcd_io.h>#include<pcl/point_types.h>#include<pcl/ModelCoefficients.h>#include<pcl/filters/project_inliers.h>#include<pcl/visualization/pcl_visualizer.h>#include<boost/th......
  • Mit6.S081笔记:知识点记录
    课程地址翻译程序到汇编的转换​ 任何一个处理器都有一个关联的ISA(InstructionSetsArchitecture,指令集架构),ISA就是处理器能够理解的指令集。每一条指令都有一个对应的二进制编码或者一个Opcode。当处理器在运行时,如果看见了这些编码,那么处理器就知道该做什么样的操作。​ 写......
  • 《Django 5 By Example》阅读笔记:p1-p16
    《Django5ByExample》学习第1天,p1-p16总结,总计16页。一、技术总结1.Django基本操作(1)创建project&创建appdjango-adminstartprojectmysitedjango-adminstartappblog(2)定义model(3)启动项目pythonmanage.pyrunserver二、英语总结(生词:8)1.fintechabbr......
  • 《程序员修炼之道:从小工到专家》阅读笔记5---交流的重要性
    在阅读《程序员修炼之道:从小工到专家》的过程中,我深刻体会到了交流在软件开发中的重要性。交流是软件开发过程中不可或缺的环节。无论是与团队成员之间的沟通,还是与用户的交流,都直接影响着项目的成功与否。良好的交流可以帮助我们更好地理解用户的需求,避免不必要的误解和返工。同......
  • 学习笔记(三十三):ArkUi-Blank (空白)
    概述:空白填充组件,在容器主轴方向上,空白填充组件具有自动填充容器空余部分的能力。仅当父组件为Row/Column/Flex时生效。一、定义:Blank(min?:number|string)min:非必填,空白填充组件在容器主轴上的最小大小,默认值:0 二、属性:color,设置空白填充的填充颜色。使用示例:......
  • 学习笔记(三十四):ArkUi-Divider (分隔)
    概述:提供分隔器组件,分隔不同内容块/内容元素。一、定义Divider()二、属性1、vertical,设置分割线的方向vertical(value:boolean)使用水平分割线还是垂直分割线。false:水平分割线;true:垂直分割线。默认值:false2、color,设置分割线的颜色color(value:ResourceColor)......
  • 学习笔记(三十二):[email protected] (布局回调)
    概述:提供注册组件布局和绘制完成回调通知的能力。一、导入模块import{inspector}from'@kit.ArkUI' 二、绑定指定组件,返回对应的监听句柄inspector.createComponentObservercreateComponentObserver(id:string):ComponentObserver 三、注册\取消注册回调参......
  • FPGA学习笔记#6 Vitis HLS For循环的优化(2)
    本笔记使用的VitisHLS版本为2022.2,在windows11下运行,仿真part为xcku15p_CIV-ffva1156-2LV-e,主要根据教程:跟XilinxSAE学HLS系列视频讲座-高亚军进行学习目录1.循环优化中的基本参数2.PIPELINE&UNROLL    2.1.PIPELINE    2.2.UNROLL3.LOOP_MERGE1.DATAFLOW......
  • 并查集+最小生成树 学习笔记+杂题 1
    图论系列:前言:相关题单:戳我算法讲解:戳我代码可能过多啊,到时候页面别卡死了,所以就把代码最前面的缺省源删了(反正就是几个头文件/defineintlonglong,自己加一下即可)。并查集记得初始化,最小生成树记得排序。P3367【模板】并查集板子题,给定\(n\)个元素,有2种操作,一种合并,......