实体属性映射框架mapstruct

news2024/10/6 22:29:11

1. 框架介绍

mapstruct框架是一种实体类间的映射框架,能够通过JAVA注解的形式将一个实体类的属性安全的赋值给另一个实体类。通过一系列注解可以定义实体类属性之间的映射关系,mapstruct会在编译期间生成映射实现类,而非通过反射的方式进行实体类赋值。

(1)安全性高,编译期就实现源对象到目标对象的映射,如果编译器能够通过,运行期就不会报错。

(2)速度快,运行期间直接调用实现类的方法,不会在运行期间使用反射进行转化。

2. 项目依赖

  • 实体Getter和Setter方法生成依赖
  • 实体映射依赖
  • JSON依赖
  • 单元测试依赖
<dependencies>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.28</version>
    </dependency>

    <dependency>
        <groupId>org.mapstruct</groupId>
        <artifactId>mapstruct</artifactId>
        <version>1.4.2.Final</version>
    </dependency>

    <dependency>
        <groupId>org.mapstruct</groupId>
        <artifactId>mapstruct-processor</artifactId>
        <version>1.4.2.Final</version>
    </dependency>

    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.83</version>
    </dependency>

    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.13.2</version>
        <scope>test</scope>
    </dependency>
</dependencies>

3. 基础映射

单一实体映射 + 批量实体映射

3.1 持久层实体类

@Getter
@Setter
public class SysUserDO implements Serializable {

    /**
     * 用户编号
     */
    private Long userId;

    /**
     * 用户姓名
     */
    private String realName;

    /**
     * 用户年龄
     */
    private Integer age;

    /**
     * 用户性别
     */
    private Boolean sex;

    /**
     * 出生日期
     */
    private LocalDate birthday;

    @Override
    public String toString() {
        return JSON.toJSONString(this);
    }
}

3.2 业务层实体类

@Getter
@Setter
public class SysUserBO {

    /**
     * 用户编号
     */
    private Long userId;

    /**
     * 用户姓名
     */
    private String realName;

    /**
     * 用户年龄
     */
    private Integer age;

    /**
     * 用户性别
     */
    private Boolean sex;

    /**
     * 出生日期
     */
    private LocalDate birthday;

    @Override
    public String toString() {
        return JSON.toJSONString(this);
    }
}

3.3 转换层接口

@Mapper
public interface SysUserTransfer {

    /**
     * 实体转换
     *
     * @param user 持久层-系统用户实体
     * @return 业务层-系统用户实体
     */
    @Mappings({
       @Mapping(source = "userId", target = "userId"),
       @Mapping(source = "realName", target = "realName"),
       @Mapping(source = "age", target = "age"),
       @Mapping(source = "sex", target = "sex"),
       @Mapping(source = "birthday", target = "birthday")
    })
    SysUserBO transfer(SysUserDO user);

    /**
     * 实体列表转换
     *
     * @param users 持久层-系统用户实体列表
     * @return 业务层-系统用户实体列表
     */
    @Mappings({
        @Mapping(source = "userId", target = "userId"),
        @Mapping(source = "realName", target = "realName"),
        @Mapping(source = "age", target = "age"),
        @Mapping(source = "sex", target = "sex"),
        @Mapping(source = "birthday", target = "birthday")
    })
    List<SysUserBO> transfers(List<SysUserDO> users);
}

3.4 接口测试类

public class SysUserTransferTest {

    @Test
    public void transfer() {
        // 1.构造持久层系统用户实例
        SysUserDO sysUserDO = new SysUserDO();
        sysUserDO.setUserId(10001L);
        sysUserDO.setRealName("亡灵天灾");
        sysUserDO.setAge(26);
        sysUserDO.setSex(true);
        sysUserDO.setBirthday(LocalDate.now());

        // 2.获取转换接口实例并转换实体
        SysUserTransfer sysUserTransfer = Mappers.getMapper(SysUserTransfer.class);
        SysUserBO sysUserBO = sysUserTransfer.transfer(sysUserDO);

        // 3.打印实体内容
        System.out.println("sysUserDO = " + sysUserDO);
        System.out.println("sysUserBO = " + sysUserBO);
    }

    @Test
    public void transfers() {
        // 1.批量构造持久层系统用户实例
        List<SysUserDO> sysUserDOS = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            SysUserDO sysUserDO = new SysUserDO();
            sysUserDO.setUserId(Long.valueOf(10000 + i));
            sysUserDO.setRealName("亡灵天灾" + i);
            sysUserDO.setAge(26);
            sysUserDO.setSex(true);
            sysUserDO.setBirthday(LocalDate.now());
            sysUserDOS.add(sysUserDO);
        }

        // 2.获取转换接口实例并批量转换实体
        SysUserTransfer sysUserTransfer = Mappers.getMapper(SysUserTransfer.class);
        List<SysUserBO> sysUserBOS = sysUserTransfer.transfers(sysUserDOS);

        // 3.批量打印实体内容
        for (int i = 0; i < 10; i++) {
            System.out.println("sysUserDO = " + sysUserDOS.get(i));
            System.out.println("sysUserBO = " + sysUserBOS.get(i));
            System.out.println("-----------------------------------------------------------------------------");
        }
    }
}
  • 单一实体转换结果
    在这里插入图片描述
  • 批量实体转换结果
    在这里插入图片描述

4. 嵌套映射

系统用户实体中包含系统角色属性的嵌套实体转换

4.1 持久层实体类

  • 持久层系统角色实体类
@Getter
@Setter
public class SysRoleDO implements Serializable {

    /**
     * 角色编号
     */
    private Long roleId;

    /**
     * 角色描述
     */
    private String roleDesc;

    @Override
    public String toString() {
        return JSON.toJSONString(this);
    }
}
  • 持久层系统用户实体类
@Getter
@Setter
public class SysUserDO implements Serializable {

    /**
     * 用户编号
     */
    private Long userId;

    /**
     * 用户姓名
     */
    private String realName;

    /**
     * 用户角色
     */
    private List<SysRoleDO> roles;

    @Override
    public String toString() {
        return JSON.toJSONString(this);
    }
}

4.2 业务层实体类

  • 业务层系统角色实体类
@Getter
@Setter
public class SysRoleBO {

    /**
     * 角色编号
     */
    private Long roleId;

    /**
     * 角色描述
     */
    private String roleDesc;

    @Override
    public String toString() {
        return JSON.toJSONString(this);
    }
}
  • 业务层系统用户实体类
@Getter
@Setter
public class SysUserBO {

    /**
     * 用户编号
     */
    private Long userId;

    /**
     * 用户姓名
     */
    private String realName;

    /**
     * 用户角色
     */
    private List<SysRoleBO> roles;

    @Override
    public String toString() {
        return JSON.toJSONString(this);
    }
}

4.3 转换层接口

  • 系统角色实体转换接口
@Mapper
public interface SysRoleTransfer {

    /**
     * 实体转换
     *
     * @param role 持久层-系统角色实体
     * @return 业务层-系统角色实体
     */
    @Mappings({
            @Mapping(source = "roleId", target = "roleId"),
            @Mapping(source = "roleDesc", target = "roleDesc")
    })
    SysRoleBO transfer(SysRoleDO role);

    /**
     * 实体列表转换
     *
     * @param roles 持久层-系统角色实体列表
     * @return 业务层-系统角色实体列表
     */
    @Mappings({
            @Mapping(source = "roleId", target = "roleId"),
            @Mapping(source = "roleDesc", target = "roleDesc")
    })
    List<SysRoleBO> transfers(List<SysRoleDO> roles);
}
  • 系统用户实体转换接口
@Mapper
public interface SysUserTransfer {

    /**
     * 实体转换
     *
     * @param user 持久层-系统用户实体
     * @return 业务层-系统用户实体
     */
    @Mappings({
        @Mapping(source = "userId", target = "userId"),
        @Mapping(source = "realName", target = "realName"),
        @Mapping(source = "roles", target = "roles")
    })
    SysUserBO transfer(SysUserDO user);

    /**
     * 实体列表转换
     *
     * @param users 持久层-系统用户实体列表
     * @return 业务层-系统用户实体列表
     */
    @Mappings({
        @Mapping(source = "userId", target = "userId"),
        @Mapping(source = "realName", target = "realName"),
        @Mapping(source = "roles", target = "roles")
    })
    List<SysUserBO> transfers(List<SysUserDO> users);
}

4.4 接口测试类

public class SysUserTransferTest {

    @Test
    public void transfer() {
        SysUserDO sysUserDO = new SysUserDO();
        sysUserDO.setUserId(10001L);
        sysUserDO.setRealName("亡灵天灾");

        SysRoleDO role1 = new SysRoleDO();
        role1.setRoleId(10001L);
        role1.setRoleDesc("超级管理员");

        SysRoleDO role2 = new SysRoleDO();
        role2.setRoleId(10002L);
        role2.setRoleDesc("系统管理员");

        sysUserDO.setRoles(new ArrayList() {{
            add(role1);
            add(role2);
        }});

        SysUserTransfer sysUserTransfer = Mappers.getMapper(SysUserTransfer.class);
        SysUserBO sysUserBO = sysUserTransfer.transfer(sysUserDO);

        System.out.println("sysUserDO = " + sysUserDO);
        System.out.println("sysUserBO = " + sysUserBO);
    }
}

在这里插入图片描述

5. 合并映射

将多个实例映射成一个实例

5.1 转换层接口

@Mapper
public interface SysUserTransfer {

    /**
     * 实体转换
     *
     * @param user 持久层-系统用户实体
     * @param roles 持久层-系统角色实体列表
     * @return 业务层-系统用户实体
     */
    @Mappings({
            @Mapping(source = "user.userId", target = "userId"),
            @Mapping(source = "user.realName", target = "realName"),
            @Mapping(source = "roles", target = "roles")
    })
    SysUserBO transfer(SysUserDO user, List<SysRoleDO> roles);
}

5.2 接口测试类

public class SysUserTransferTest {

    @Test
    public void transfer() {
        SysUserDO sysUserDO = new SysUserDO();
        sysUserDO.setUserId(10001L);
        sysUserDO.setRealName("亡灵天灾");

        SysRoleDO role1 = new SysRoleDO();
        role1.setRoleId(10001L);
        role1.setRoleDesc("超级管理员");

        SysRoleDO role2 = new SysRoleDO();
        role2.setRoleId(10002L);
        role2.setRoleDesc("系统管理员");

        List<SysRoleDO> roles = new ArrayList() {{
            add(role1);
            add(role2);
        }};

        SysUserTransfer sysUserTransfer = Mappers.getMapper(SysUserTransfer.class);
        SysUserBO sysUserBO = sysUserTransfer.transfer(sysUserDO, roles);

        System.out.println("sysUserDO = " + sysUserDO);
        System.out.println("sysUserBO = " + sysUserBO);
    }
}

在这里插入图片描述

6. 特殊映射

(1)常量

(2)默认值

(3)表达式

(4)自定义映射

6.1 转换层接口

@Mapper(imports = {UUID.class})
public interface SysUserTransfer {

    /**
     * 实体转换
     *
     * @param user 持久层-系统用户实体
     * @return 业务层-系统用户实体
     */
    @Mappings({
        @Mapping(target = "userId", constant = "1001L"),
        @Mapping(source = "age", target = "age", defaultValue = "25"),
        @Mapping(target = "realName", expression = "java(UUID.randomUUID().toString())"),
        @Mapping(source = "hight", target = "hight", qualifiedByName = "hightHandle")
    })
    SysUserBO transfer(SysUserDO user);

    /**
     * 用户身高特殊处理
     * 
     * @param sourceHight 原始身高
     * @return 结果身高
     */
    @Named(value = "hightHandle")
    default Double hightHandle(Double sourceHight) {
        return Objects.nonNull(sourceHight) ? sourceHight + 10 : sourceHight;
    }
}

6.2 接口测试类

public class SysUserTransferTest {

    @Test
    public void transfer() {
        SysUserDO sysUserDO = new SysUserDO();
        sysUserDO.setUserId(10002L);
        sysUserDO.setRealName("亡灵天灾");
        sysUserDO.setHight(171.50);

        SysUserTransfer sysUserTransfer = Mappers.getMapper(SysUserTransfer.class);
        SysUserBO sysUserBO = sysUserTransfer.transfer(sysUserDO);

        System.out.println("sysUserDO = " + sysUserDO);
        System.out.println("sysUserBO = " + sysUserBO);
    }
}

在这里插入图片描述

7. 切面处理

(1)映射前置处理

(2)映射后置处理

7.1 转换层接口

@Mapper
public interface SysUserTransfer {

    /**
     * 实体转换
     *
     * @param user 持久层-系统用户实体
     * @return 业务层-系统用户实体
     */
    @Mappings({
        @Mapping(source = "userId", target = "userId"),
        @Mapping(source = "realName", target = "realName"),
        @Mapping(source = "age", target = "age"),
        @Mapping(source = "hight", target = "hight")
    })
    SysUserBO transfer(SysUserDO user);
    
    /**
     * 前置处理
     *
     * @param sourceUser 原始系统用户
     */
    @BeforeMapping
    default void beforeMapping(SysUserDO sourceUser) {
        System.out.println("sourceUser = " + sourceUser);
    }

    /**
     * 后置处理
     * @param targetUser 目标系统用户
     */
    @AfterMapping
    default void afterMapping(@MappingTarget SysUserBO targetUser) {
        System.out.println("targetUser = " + targetUser);
    }
}

7.2 接口测试类

public class SysUserTransferTest {

    @Test
    public void transfer() {
        SysUserDO sysUserDO = new SysUserDO();
        sysUserDO.setUserId(10001L);
        sysUserDO.setRealName("亡灵天灾");
        sysUserDO.setAge(25);
        sysUserDO.setHight(171.50);

        SysUserTransfer sysUserTransfer = Mappers.getMapper(SysUserTransfer.class);
        SysUserBO sysUserBO = sysUserTransfer.transfer(sysUserDO);

        System.out.println("sysUserDO = " + sysUserDO);
        System.out.println("sysUserBO = " + sysUserBO);
    }
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1183294.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Dcoker学习笔记(一)

Dcoker学习笔记一 一、 初识Docker1.1 简介1.2 虚拟机和docker的区别1.3 Docker架构1.4 安装Docker&#xff08;Linux&#xff09; 二、 Dcoker基本操作2.1 镜像操作2.2 容器操作练习 2.3 数据卷volume&#xff08;容器数据管理&#xff09;简介数据卷语法数据卷挂载 2.4 自定义…

【Git】Git基础命令操作速记

【Git】Git基础命令操作速记 文章目录 【Git】Git基础命令操作速记1. 初始化1.1 设置用户名和邮箱1.2 初始化仓库 2. 基础命令2.1 add和commit2.2 reset2.3 查看日志2.4 删除/找回本地仓库文件2.5 找回暂存区文件2.6 diff命令(找不同) 3. 分支命令3.1 查看分支3.2 创建分支3.3 …

深度学习之基于YoloV5的火灾检测系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 火灾检测系统基于YoloV5的介绍 火灾检测是一项重要的安全任务&#xff0c;它旨在及时发现和报警火灾风险。基于深度…

postgresql|数据库|提升查询性能的物化视图解析

前言&#xff1a; 我们一般认为数字的世界是一个虚拟的世界&#xff0c;OK&#xff0c;但我们其实有些需求是和现实世界一模一样的&#xff0c;比如&#xff0c;数据库尤其是关系型数据库&#xff0c;希望在使用的数据库能够更快&#xff08;查询速度&#xff09;&#xff0c;…

《008.Springboot+vue之自习室选座系统》

[火]《008.Springbootvue之自习室选座系统》 项目简介 [1]本系统涉及到的技术主要如下&#xff1a; 推荐环境配置&#xff1a;DEA jdk1.8 Maven MySQL 前后端分离; 后台&#xff1a;SpringBootMybatisredis; 前台&#xff1a;vueElementUI; [2]功能模块展示&#xff1a; 前端…

云端生成式 AI – 基于 Amazon EKS 的 Stable Diffusion 图像生成方案

Stable Diffusion 是当下生成式 AI 领域最受欢迎的开源多模态语言-图像模型&#xff0c;由于其易用的接口和良好的使用体验&#xff0c;受到了开源社区和广大设计行业从业者的追捧。Stable Diffusion 模型版本正在快速迭代&#xff0c;并带动了各行各业的生产力变革。目前市场上…

vmware16.1.2安装 windows7后 VMVMware tools 灰色 需要手动安装操作详情

问题1&#xff1a; 问题描述&#xff1a; 在Windows7镜像安装完成后&#xff0c;安装"VMware Tools"时出现&#xff1a;安装程序无法继续&#xff0c;需要将操作系统更新到SP1.2 重新安装后也没办法解决。 证明问题没有出在操作系统上&#xff1b;那么&#xff0c…

RISC Zero的Bonsai证明服务

1. 引言 Bonsai为通用ZKP网络&#xff0c;其支持任意链、任意协议、以及任意应用&#xff0c;利用ZKP来扩容、隐私和互操作。Bonsai的目标是为每条链都提供无限计算的能力。 借助Bonsai&#xff0c;可仅需数天的开发&#xff0c;即可实现对以太坊、L1链、Cosmos app链、L2 ro…

Mybatis-Plus使用Wrapper自定义SQL

文章目录 准备工作Mybatis-Plus使用Wrapper自定义SQL注意事项目录结构如下所示domain层Controller层Service层ServiceImplMapper层UserMapper.xml 结果如下所示&#xff1a;单表查询条件构造器单表查询&#xff0c;Mybatis-Plus使用Wrapper自定义SQL联表查询不用&#xff0c;My…

Java进击框架:Spring-数据存取(七)

Java进击框架&#xff1a;Spring-数据存取&#xff08;七&#xff09; 前言事务管理声明式事务管理 DAO支持JDBC的数据访问使用JdbcTemplate控制数据库连接JDBC批处理操作封装 SQL 语句中的参数 使用R2DBC进行数据访问对象关系映射(ORM)数据访问HibernateJPA XML模式 前言 参考…

目标检测算法 - YOLOv1

文章目录 1. 作者简介2. 目标检测综述3. YOLOv1算法3.1 预测阶段3.2 预测阶段后处理3.3 训练阶段 YOLO的全称是you only look once&#xff0c;指只需要浏览一次就可以识别出图中的物体的类别和位置。 YOLO是目标检测模型。目标检测是计算机视觉中比较简单的任务&#xff0c;用…

10-26 maven配置

打开idea 打开setting 基于Idea创建idea项目 加载jar包&#xff1a;(一般需要自己去手动加入&#xff0c;本地仓库是没有的)

【HarmonyOS】HarmonyOS备案获取公钥和指纹

【关键字】 HarmonyOS应用、鸿蒙应用、元服务、应用备案 HarmonyOS应用在华为云等平台进行应用备案时&#xff0c;平台需要提供用公钥和签名指纹的信息&#xff0c;Android可以直接通过keystore或jks签名文件进行签名信息获取&#xff0c;HarmonyOS签名方式与Android不同&…

LangChain之关于RetrievalQA input_variables 的定义与使用

最近在使用LangChain来做一个LLMs和KBs结合的小Demo玩玩&#xff0c;也就是RAG&#xff08;Retrieval Augmented Generation&#xff09;。 这部分的内容其实在LangChain的官网已经给出了流程图。 我这里就直接偷懒了&#xff0c;准备对Webui的项目进行复刻练习&#xff0c;那么…

Spring Cloud - 手写 Gateway 源码,实现自定义局部 FilterFactory

目录 一、FilterFactory 分析 1.1、前置知识 1.2、分析源码 1.2.1、整体分析 1.2.2、源码分析 1.3、手写源码 1.3.1、基础框架 1.3.2、实现自定义局部过滤器 1.3.3、加参数的自定义局部过滤器器 一、FilterFactory 分析 1.1、前置知识 前面的学习我们知道&#xff0c…

云服务器搭建flink集群

文章目录 1.集群配置2.修改集群配置3. 访问Web UI4. 提交作业方式5.Yarn部署模式配置5.1 会话模式部署&#xff08;Session Mode&#xff09;5.2 单作业模式(Per-job Mode)5.3 应用模式部署&#xff08;推荐&#xff09;5.3.1 上传HDFS提交&#xff08;推荐&#xff09; 5.4 历…

SpringCloudAlibaba——Sentinel

Sentinel也就是我们之前的Hystrix&#xff0c;而且比Hystrix功能更加的强大。Sentinel是分布式系统的流量防卫兵&#xff0c;以流量为切入点&#xff0c;从流量控制、流量路由、熔断降级等多个维度保护服务的稳定性。 Sentinel采用的是懒加载&#xff0c;这个接口被访问一次&a…

爬取Elastic Stack采集的Nginx内容

以下是一个简单的Go语言爬虫程序&#xff0c;用于爬取Elastic Stack采集的Nginx内容。请注意&#xff0c;这只是一个基本的示例&#xff0c;实际使用时可能需要根据具体情况进行修改和扩展。 package mainimport ("fmt""net/http""io/ioutil" )…

高效接口重试机制的实现

实现一个高效的接口重试机制对于保证系统的稳定性和可靠性至关重要。在面对网络不稳定、服务端故障或者高负载的情况下&#xff0c;接口重试机制能够确保请求的成功执行&#xff0c;同时也需要保证在重试过程中不会造成额外的负担或不必要的延迟。本文将为您介绍高效接口重试机…

工业相机基本知识理解:靶面尺寸、像元尺寸、分辨率

1、靶面尺寸&#xff1a;由Sensor对角线长度表示&#xff0c;单位英寸&#xff0c;这里的1英寸16mm 2、像元尺寸&#xff1a;单个感光元件的大小&#xff0c;一般都是正方形&#xff0c;边长单位um 3、分辨率&#xff1a; Sensor长边像元数 Sensor短边像元数&#xff0c;俗称像…