MapStruct的用法

本文介绍了MapStruct的使用,包括依赖导入,如何定义转换接口、创建实体类并进行测试,以及常用的映射注解如@Mapping的用法。底层实现基于getter和setter方法,性能高效。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

最近工作中发现公司代码中频繁用到MapStruct,了解之后发现特别好用,特此记录一下


一、依赖导入

使用Mapstruct需要依赖的包如下,mapstruct、mapstruct-processor、lombok,可以去仓库中查看最新版本。

<dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct</artifactId>
            <version>1.5.0.Final</version>
        </dependency>
        <dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct-processor</artifactId>
            <version>1.5.0.Final</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.12</version>
        </dependency>

二、简单使用

2.1、定义转换的接口

@Mapper
public interface copy {

    copy INSTANCT= Mappers.getMapper(copy.class);
    UserPo po2entity(UserEntity userEntity);
}

2.2、创建实体类

import lombok.Data;
import java.util.Date;


@Data
public class UserPo {
    private String name;
    private Integer age;
    private Date createTime;
}
import lombok.Data;
import java.util.Date;
@Data
public class UserEntity {
    private String name;
    private Integer age;
    private Date createTime;
}

2.3、测试

    public static void main(String[] args) {
            UserEntity userEntity=new UserEntity();
            userEntity.setAge(18);
            userEntity.setName("汪汪");
            userEntity.setCreateTime(new Date());

            UserPo userPo=copy.INSTANCT.po2entity(userEntity);
            System.out.println(userEntity);
            System.out.println("-----------------------------------------");
            System.out.println(userPo);
    }

可以看到已经完美复制成功了
在这里插入图片描述

2.4、底层实现

那么这是怎么实现的呢?
从生成的代码可以看出,转化过程非常简单,只使用了UserPo的get方法和UserEntity的set方法,没有复杂的逻辑处理,清晰明了,所以性能很高。
在这里插入图片描述

三、常用的注解

3.1、@Mapping(target = “xxx1”,source = “xxx2”)

这个注解可以将 userEntity中name的值映射到UserPo中的bigname字段上
例如
首先修改UserPo

@Data
public class UserPo {
    private String bigname;
    private Integer age;
    private Date createTime;
}

然后修改对应方法

    @Mapping(target = "bigname",source = "name")
    UserPo po2entity(UserEntity userEntity);

请添加图片描述
可以看到结果是预期的结果

3.2、@Mapping(target = “xxx”, expression = “java(xxx1()”)

这个注解可以把UserPo中createTime的值转换为java中的某个方法返回的值

@Mapping(target = "createTime",expression = "java(getdata())")
    UserPo po2entity(UserEntity userEntity);

    default Date getdata()
    {
        return new Date();
    }

在主函数中去掉userEntity.setCreateTime(new Date()

    public static void main(String[] args) {
            UserEntity userEntity=new UserEntity();
            userEntity.setAge(18);
            userEntity.setName("汪汪");
//          userEntity.setCreateTime(new Date());
            UserPo userPo=copy.INSTANCT.po2entity(userEntity);
            System.out.println(userEntity);
            System.out.println("-----------------------------------------");
            System.out.println(userPo);
    }

结果如下
请添加图片描述
可以看见符合预期结果
假如说一个字段的值需要从数据库里查 那么方法换成对应查询的方法就可以了

3.4、@Mapping(target = “xxx”,constant = “xxx”)

这个注解可以把某个值赋初始值

@Mapping(target = "age",constant = "1000")
UserPo po2entity(UserEntity userEntity);

请添加图片描述
可以看到符合预期结果

3.5、@Mapping(target = “xx”,defaultValue=“x”)

该注解判断xx字段有无接收到值,没有的话赋默认值x 有的话用接收到的值

    @Mapping(target = "age",defaultValue="1")
    UserPo po2entity(UserEntity userEntity);

请添加图片描述
可以看到符合预期结果

3.6、@Mapping(target = “id”, ignore = true)

这个注解可以要指定映射的字段被忽略

    @Mapping(target = "age",ignore = true)
    UserPo po2entity(UserEntity userEntity);

在这里插入图片描述
结果是符合预期的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值