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对象映射 |
---|---|---|---|
实现方式 |
手动调用 |
使用 |
编译时生成代码,通过注解定义映射 |
优点 |
直接且灵活,完全可控 |
代码简洁,易于使用 |
高性能,支持复杂映射,自定义规则 |
缺点 |
代码冗长,易出错 |
仅支持简单类型转换 |
配置较为复杂,需依赖 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); }