前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【后端】MapStruct 使用详解

【后端】MapStruct 使用详解

作者头像
框架师
发布2022-09-02 11:40:34
1.2K0
发布2022-09-02 11:40:34
举报

前言:

使用 MapStruct 前置知识:

  • Entity: 最常用的实体类,基本和数据表一一对应,一个实体一张表。
  • Bo(Business object): 代表业务对象的意思。
  • Vo(Value Object): 返回视图层的对象。
  • Po(Persistant Object): 代表持久层对象的意思。
  • Dto(Data Transfer Object): 代表数据传输对象的意思。

常见场景: 比如一个 insert 方法, 在前端传输数据的时候, 为了隐藏后端表结构, 我们会选择构建一个 Dto 来接收数据, 再将 Dto 的值传递给 Entity , 这样省不了大量的 getter/setter 调用, 当一个项目中存在大量的赋值操作, 代码会非常冗余. 这时候如果有一个非常方便的属性映射框架, 可以大大提高我们的效率. 下面进入正题, 来聊聊 MapStruct.

MapStruct 说明

mapstruct 是专门用来处理上面常见实体类与属性类的属性映射的, 我们只需定义 mapper 接口,mapstruct 在编译的时候就会自动的帮我们实现这个映射接口,避免了麻烦复杂的映射实现。

项目官网和示例

项目引入 MapStruect

<!-- mapstruct -->
<dependency>
 	<groupId>org.mapstruct</groupId>
 	<artifactId>mapstruct</artifactId>
 	<version>${mapstruct.version}</version>
</dependency>
<dependency>
 	<groupId>org.mapstruct</groupId>
 	<artifactId>mapstruct-processor</artifactId>
 	<version>${mapstruct.version}</version>
</dependency>

<!-  最新版本  1.5.2 -->
<mapstruct.version>1.5.2.Final</mapstruct.version>

示例程序

  1. 创建 entyty 实体类
@Data
public class RuleEntity {
    private Long id;
    private String name;
    private Integer age;
    private Integer sex;
    private Date createTime;
}
  1. 创建 Dto 参数实体
@Data
public class RuleDto {
    private String name;
    private Integer age;
    private Integer sex;
}
  1. 创建 Vo 视图层视图
@Data
public class RuleVo {
    private String name;
    private Integer age;
    private Integer sex;
    private Date createTime;
}
  1. 定义 mapstruct 接口
import org.mapstruct.Mapper;
import org.mapstruct.Mappings;
import org.mapstruct.factory.Mappers;

@Mapper
public interface RuleMapper {

    RuleMapper INSTANCE = Mappers.getMapper(RuleMapper.class);

    /**
     * dto 转 entity
     *
     * @param ruleDto 参数对象
     * @return Rule 对象
     */
    @Mappings({})
    Rule toDto(RuleDto ruleDto);
    
    /**
     * entity 转 vo
     *
     * @param rule 实体对象
     * @return RuleVo 视图对象
     */
    @Mappings({})
    RuleVo toDto(Rule rule);
}
  1. 使用转换器
// 调用转换器方法,将要转换的参数对象传递进去即可,
Rule rule = RuleMapper.INSTANCE.toDto(ruleDto);
// entity 转 vo
RuleVo ruleVo = RuleMapper.INSTANCE.toVo(rule);
  1. 查看编译结果

待编译完成后,mapstruct 会自动帮我们生成一个实现类,RuleMapperImpl,查看这个实现类,mapstruct 会自动帮我们生成一个实现类。

多参数转换,如果遇到多参数转换,在实际业务场景中,我们会经常遇到 json 转换的字符串存入某个属性中,或者好几个类的组合成一个新的类返回。

需要了解 @mapping 注解

里面有两个常用参数

  • target : 表示转换后的字段
  • source : 表示转换前的源字段
  • 示例代码
/**
 * 转换器
 *
 * @param alertMessage  alertMessage
 * @param devicesConfig devicesConfig
 * @param data          alertMessage
 * @param measurement   measurement
 * @return BaseDeviceData
 */
@Mappings({
        @Mapping(target = "projectId", source = "alertMessage.projectId"),
        @Mapping(target = "alarmType", source = "alertMessage.msgType"),
        @Mapping(target = "alarmId", source = "devicesConfig.hxzId")
})
BaseDeviceAlarmData toBase(LbAlertMessage alertMessage, LbDevicesConfig devicesConfig, String data, String measurement);
  • 参数传递
BaseDataConverterMapper.INSTANCE.toBase(lbAlertMessage,devicesConfig,JSON.toJSONString(lbAlertMessage),DeviceName.DEVICE_ALARM_DATA.getAlias())

非常方便

  • 实现类
public class BaseDataConverterMapperImpl implements BaseDataConverterMapper {

    @Override
    public BaseDeviceAlarmData toBase(LbAlertMessage alertMessage, LbDevicesConfig devicesConfig, String data, String measurement) {
        if ( alertMessage == null && devicesConfig == null && data == null && measurement == null ) {
            return null;
        }

        BaseDeviceAlarmData baseDeviceAlarmData = new BaseDeviceAlarmData();

        if ( alertMessage != null ) {
            baseDeviceAlarmData.setProjectId( alertMessage.getProjectId() );
            baseDeviceAlarmData.setAlarmType( alertMessage.getMsgType() );
        }
        if ( devicesConfig != null ) {
            if ( devicesConfig.getHxzId() != null ) {
                baseDeviceAlarmData.setAlarmId( Long.parseLong( devicesConfig.getHxzId() ) );
            }
            baseDeviceAlarmData.setEnterpriseId( devicesConfig.getEnterpriseId() );
            baseDeviceAlarmData.setType( devicesConfig.getType() );
        }
        if ( data != null ) {
            baseDeviceAlarmData.setData( data );
        }
        if ( measurement != null ) {
            baseDeviceAlarmData.setMeasurement( measurement );
        }

        return baseDeviceAlarmData;
    }
}

使用 mapstruct 可以大大提高效率,优化冗余代码,快快用起来吧!

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-04-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言:
  • MapStruct 说明
    • 项目官网和示例
    • 项目引入 MapStruect
    • 示例程序
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档