首页 > 其他分享 >22、MapStruct对象映射转换

22、MapStruct对象映射转换

时间:2024-12-16 23:42:09浏览次数:8  
标签:UserDTO 22 映射 MapStruct userEntity import userDTO public

一、对象转换方式:

1、SET与GET赋值方式:

SET与GET赋值方式是最基本的一种对象转换方式。通过手动调用源对象的 getter 方法,获取源对象的属性值,然后通过目标对象的 setter方法将值设置到目标对象中。

public class UserDTO {
    private String name;
    private int age;

    // Getters and Setters
}

public class UserEntity {
    private String name;
    private int age;

    // Getters and Setters
}

public class Converter {
    public UserDTO convertToDTO(UserEntity userEntity) {
        UserDTO userDTO = new UserDTO();
        userDTO.setName(userEntity.getName());
        userDTO.setAge(userEntity.getAge());
        return userDTO;
    }

    public UserEntity convertToEntity(UserDTO userDTO) {
        UserEntity userEntity = new UserEntity();
        userEntity.setName(userDTO.getName());
        userEntity.setAge(userDTO.getAge());
        return userEntity;
    }
}

2、BeanUtils工具类转换方式:

BeanUtils 是 Apache Commons BeanUtils 库提供的工具类,它可以简化对象之间的属性复制工作。通过 BeanUtils.copyProperties() 方法,可以将一个对象的属性值复制到另一个对象中,通常用于对象之间的转换。该方法会自动映射源对象和目标对象的同名属性。

import org.apache.commons.beanutils.BeanUtils;

public class UserDTO {
    private String name;
    private int age;

    // Getters and Setters
}

public class UserEntity {
    private String name;
    private int age;

    // Getters and Setters
}

public class Converter {
    public UserDTO convertToDTO(UserEntity userEntity) throws Exception {
        UserDTO userDTO = new UserDTO();
        BeanUtils.copyProperties(userDTO, userEntity);  // 复制属性
        return userDTO;
    }

    public UserEntity convertToEntity(UserDTO userDTO) throws Exception {
        UserEntity userEntity = new UserEntity();
        BeanUtils.copyProperties(userEntity, userDTO);  // 复制属性
        return userEntity;
    }
}

3、MapStruct对象映射转换方式:

底层基于SET与GET赋值方式实现

特性SET与GET赋值方式BeanUtils工具类MapStruct对象映射

实现方式

手动调用 getter 和 setter

使用 BeanUtils.copyProperties()

编译时生成代码,通过注解定义映射

优点

直接且灵活,完全可控

代码简洁,易于使用

高性能,支持复杂映射,自定义规则

缺点

代码冗长,易出错

仅支持简单类型转换

配置较为复杂,需依赖 MapStruct

性能

较低(尤其是大量属性时)

较低(反射机制)

高(编译时生成代码)

 

二、MapStruct对象映射转换方式的基本使用:

1、POM依赖:

<!--MapStruct 依赖-->
<dependency>
     <groupId>org.mapstruct</groupId>
     <artifactId>mapstruct</artifactId>
     <version>1.4.1.Final</version>
</dependency>
<!--MapStruct 注解处理器-->
<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct-processor</artifactId>
    <version>1.4.1.Final</version>
</dependency>

注:

MapStruct版本与SpringBoot版本相对应
MapStruct依赖必须在Lombok依赖的后面

2、常规处理:

在MapStruct中,若两个类型中的属性名称相同,则会自动完成转换。

import com.example.mapstructdemo.model.UserBasicVO;
import com.example.mapstructdemo.model.UserResponseVO;
import org.mapstruct.Mapper;


/**
 * 常规处理转换:
 * 在MapStruct中,若两个类型中的属性名称相同,则会自动完成转换。
 * */
@Mapper(componentModel = "spring")
public interface ConventionalProcessingConversion {

    UserResponseVO toHandelUserInfo(UserBasicVO userBasicVO);

}

3、特殊处理:

在MapStruct中,若想自定义转换的属性,则可使用@Mapping注解进行处理。

import com.example.mapstructdemo.model.TypeEnums;
import com.example.mapstructdemo.model.UserBasicVO;
import com.example.mapstructdemo.model.UserResponseVO;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;

/**
 * 特殊处理转换:
 *     1、时间格式化
 *     2、返回值处理
 *     3、默认值设置
 *     ......
 *
 * */
@Mapper(componentModel = "spring", imports = {TypeEnums.class}) //TypeEnums:自定义枚举转换等方式
public interface SpecialProcessingConversion {

    @Mappings({
            @Mapping(target = "type",expression = "java(TypeEnums.getValue(userBasicVO.getType()))"),//返回值处理
            @Mapping(target = "createDate", dateFormat = "yyyy-MM-dd HH:mm:ss"),//日期格式转换
            @Mapping(target = "info", source = "sex"), //target用来指定要处理的目标类型的属性,source用来指定源类型的属性名
            // @Mapping(target = "info", source = "sex", defaultExpression = "java( com.demo.UserSexMethod.getDefaultSex())"), //sex为null,设置自定义默认值
            @Mapping(target = "info2", constant = "备注信息")//赋值
    })
    UserResponseVO toHandelUserInfo(UserBasicVO userBasicVO);

}

 

标签:UserDTO,22,映射,MapStruct,userEntity,import,userDTO,public
From: https://www.cnblogs.com/Iven-L/p/18611312

相关文章

  • 【经管数据】企业排污许可企业信息数据大全(1954-2022年)
    一、数据范围:数据量庞大,能统计的企业均有二、包含字段:企业名称      登记状态      法定代表人      注册资本      成立日期      核准日期      所属省份      所属城市      所属区县      电话......
  • 20222314 2024-2025-1 《网络与系统攻防技术》实验八实验报告
    202223142024-2025-1《网络与系统攻防技术》实验八实验报告1.实验内容1.1Web前端HTML能正常安装、启停Apache。理解HTML,理解表单,理解GET与POST方法,编写一个含有表单的HTML1.2Web前端javascipt理解JavaScript的基本功能,理解DOM在1的基础上,编写JavaScript验证用户名、密......
  • esp32-将flash分区进行内存映射
    1.前言为什么需要将flash分区映射到内存区域在某些情况下,我们需要在单片机中保存一个较大的数组,比如字库、图片等,使用const将其编译到代码中,可以指针访问他们。但是,在线刷或者OTA更新时,也不可避免的需要更新他们,造成了时间或者空间上的浪费。但是如果将其按照静态数据存放在fl......
  • node升级为22.*后,npm不可用,npm:无法加载文件
    错误信息如下: 一、打开终端: 二、此由本地策略组引发,可通过命令查看策略:Get-ExecutionPolicy-List如结果都显示Undefined,那代表没有设置安全策略   三、使用以下命令来更改执行策略为RemoteSigned并设置为作用于当前用户Set-ExecutionPolicy-scopeCurren......
  • 11.22
    4 . 阿姆达尔定律阿姆达尔定律是由计算机工程先锋基恩 • 阿姆达尔(GeneAmdahl)提出并用他的名字命名的,它定义了优化一部分代码对整体性能有多大改善。阿姆达尔定律有多种表达方式,不过就优化而言,可以表示为下面的等式:(1 )S(t)=1/(1-P)+P/S(p)其中 S(t) 是因优化而导致程序......
  • MEDIQ:面向可靠临床推理的主动问诊型大模型,基于信息缺失场景下的动态交互式医疗诊断研
    MEDIQ:面向可靠临床推理的主动问诊型大模型,基于信息缺失场景下的动态交互式医疗诊断研究,提升诊断准确率22.3%论文大纲理解1.最终目标2.层层分解的关键问题3.解决方案及效果4.思路特点结构分析1.层级结构分析叠加形态(能力层层递进)构成形态(部件组合带来新能力)......
  • NAT server之服务器映射(端口映射)--华为篇
    技术背景在很多场景中,比如企业、学校、甚至家里都有一些对外的业务提供,比如门户网址、NAS、ERP等,在实际部署中,这些提供访问的服务器都属于内网,配置的是内网地址,导致的情况是公网用户没法对私网地址直接进行访问,学过上篇内容的源NAT功能是把私网用户的源地址转换成可上网的地址......
  • Ubuntu 22.04 部署 Kubernetes v1.30
    1Shell工具xshell免费版,工具菜单下可选,同时控制所有的会话,后面不同节点安装Kubernetes会提高效率2节点规划Linux为UbuntuServer22.04,下载地址https://ubuntu.com/download/server域名IP资源节点名k8s-master192.168.0.1508C16Gk8s-masterk8s-node1......
  • WindowsServer2022部署DHCP服务器及其中继服务器
    Step0:环境检查首先需要关闭VMware自带的DHCP服务,这个会影响自己的DHCP服务 把使用本地DHCP服务将IP地址分配关闭即可 给VM1网卡一个静态的IP地址,需要在子网81.6.63.0/24网段里即可  我这里给的是81.6.63.100/24Step1:在WindowsServer上的配置    ......
  • 如何在 Ubuntu 22.04 上使用 vnStat 监控网络流量
    简介vnStat是一个免费的、开源的、基于控制台的Linux操作系统网络流量监控工具。通过vnStat,你可以在不同的时间段监控网络统计数据。它简单、轻量级,并且消耗的系统资源很小。vnStat允许你按小时、日、月、周和日生成网络流量数据。本教程将向你展示如何在Ubuntu22.04上安......