22、MapStruct对象映射转换

一、对象转换方式:

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);

}

 

posted on 2024-12-16 23:32  爱文(Iven)  阅读(52)  评论(0编辑  收藏  举报

导航