SpringBoot + MapStruct 属性映射工具的使用详解

 更新时间:2021年09月18日 08:39:33   作者:机智的爆爆哥  
MapStruct 是一个代码生成器,简化了不同的 Java Bean 之间映射的处理,所谓的映射指的就是从一个实体变化成一个实体。接下来通过本文给大家介绍SpringBoot + MapStruct 属性映射工具的使用,需要的朋友可以参考下

1. MapStruct 是什么?

截取下官方的原话 我给翻译了一下 说白了 当你的对象A有几十个属性 而另一个对象B 与A比较只有一些细微的差别

那么这时候只需要映射过去即可 而不需要疯狂的调用set方法 进行属性的拷贝 这就是这个工具给我们带来的最大便利

官方github链接 点击跳转

2. 引入依赖

采用Mapstruct的 最新版本 1.4.2.Final

SpringBoot版本不要选新版的 我对比了下 2.3.02.5.4 后者会出现属性映射为null的情况

已经将问题反馈了 具体不知道是和原因 所以先用老版本吧

下面的插件最好与我的保持一致 否则会导致一些问题

 <properties>
        <java.version>1.8</java.version>
        <mapstruct.version>1.4.2.Final</mapstruct.version>
    </properties>
    
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct</artifactId>
            <version>${mapstruct.version}</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
      <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                    <annotationProcessorPaths>
                        <!-- 引入 mapstruct-processor -->
                        <path>
                            <groupId>org.mapstruct</groupId>
                            <artifactId>mapstruct-processor</artifactId>
                            <version>${mapstruct.version}</version>
                        </path>
                        <!-- 引入 lombok-processor -->
                        <path>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                            <version>${lombok.version}</version>
                        </path>
                    </annotationProcessorPaths>
                </configuration>
            </plugin>
        </plugins>
    </build>

3.当两个对象属性完全相同时 User 类

新建 User 类 随便加点属性进去

@Data
@Accessors(chain = true)
public class User {

    private String name;
    private String password;
    private String money;
}

UserVo 类

再新建一个我们需要拷贝过去的对象 UserVo 属性完全相同

@Data
@Accessors(chain = true)
public class UserVo {

    private String name;
    private String password;
    private String money;
}

转换接口 UserConvert

@Mapper// 注意 这里的注解是org.mapstruct包下的
public interface UserConvert {
    //默认写法 调用getMapper 获取对应的实体类 编译后会生成对应的实现类
    UserConvert INSTANCE = Mappers.getMapper(UserConvert.class);

    UserVo convert(User user);
}

我们将代码编译一下 在 target目录下 找到对应的实现类 UserConvertImpl

可以发现他其实就是将对应的属性设置到了 Vo对象中罢了 只不过这是自动生成的

public class UserConvertImpl implements UserConvert {
    public UserConvertImpl() {
    }

    public UserVo convert(User user) {
        if (user == null) {
            return null;
        } else {
            UserVo userVo = new UserVo();
            userVo.setName(user.getName());
            userVo.setPassword(user.getPassword());
            userVo.setMoney(user.getMoney());
            return userVo;
        }
    }
}

测试属性赋值

在对应的测试类里 转化打印

    @Test
    void contextLoads() {
        User user = new User().setName("爆爆").setPassword("123").setMoney("500");
        UserVo userVo = UserConvert.INSTANCE.convert(user);
        System.out.println(userVo);
    }

打印结果如下

UserVo(name=爆爆, password=123, money=500)

4. 当对象属性有所差别时 UserVo2

对应的User 不变 新增 一个 UserVo2

将原先的name改成了UserName

@Data
@Accessors(chain = true)
public class UserVo2 {
    //name--->userName
    private String userName;
    private String password;
    private String money;
}

这时候我们要将User的属性值直接赋予 其实是不会报错的 只不过name不会映射给UserName 而已

修改转换类

@Mapper// 注意 这里的注解是org.mapstruct包下的
public interface UserConvert {
    //默认写法 调用getMapper 获取对应的实体类 编译后会生成对应的实现类
    UserConvert INSTANCE = Mappers.getMapper(UserConvert.class);

    UserVo convert(User user);
	//新增一个方法
    UserVo2 convert2(User user);

}

再次测试

@Test
    void contextLoads() {
        User user = new User().setName("爆爆").setPassword("123").setMoney("500");
        UserVo2 userVo2 = UserConvert.INSTANCE.convert2(user);
        System.out.println(userVo2);
    }

打印结果

UserVo2(userName=null, password=123, money=500)

如果要要将 name 赋值给 userName 其实也很简单 操作如下

新增 @Mappings@Mapping注解 指明对应哪个属性赋值给哪个就可以了

@Mapper// 注意 这里的注解是org.mapstruct包下的
public interface UserConvert {
    //默认写法 调用getMapper 获取对应的实体类 编译后会生成对应的实现类
    UserConvert INSTANCE = Mappers.getMapper(UserConvert.class);

    UserVo convert(User user);

    @Mappings({
            //对应 source指向的是User targer指向的是UserVo2
            @Mapping(source = "name",target = "userName")
    })
    UserVo2 convert2(User user);

}

再次运行测试类

打印结果 发现没有问题

UserVo2(userName=爆爆, password=123, money=500)

5. IDEA插件

mapstrut有对应的idea插件 其实我觉得作用一般吧 还是放上吧

插件链接

由于自己研究的也不多 暂时写到这里

我们执着于那些遗憾,并非那些事情有多重要,而是那些时光里的自己,是真诚坦率且可爱的,也许这才是我们执着的意义。

到此这篇关于SpringBoot + MapStruct 属性映射工具的使用的文章就介绍到这了,更多相关SpringBoot属性映射工具内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • 使用Java读取Word文件的简单例子分享

    使用Java读取Word文件的简单例子分享

    这篇文章主要介绍了使用Java读取Word文件的简单例子分享,包括读取word文件的表格数据的示例,需要的朋友可以参考下
    2015-10-10
  • 教你Java中的Lock锁底层AQS到底是如何实现的

    教你Java中的Lock锁底层AQS到底是如何实现的

    本文是基于ReentrantLock来讲解,ReentrantLock加锁只是对AQS的api的调用,底层的锁的状态(state)和其他线程等待(Node双向链表)的过程其实是由AQS来维护的,对Java Lock锁AQS实现过程感兴趣的朋友一起看看吧
    2022-05-05
  • Springboot中yml文件没有叶子图标的解决

    Springboot中yml文件没有叶子图标的解决

    这篇文章主要介绍了Springboot中yml文件没有叶子图标的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • java实现登录之后抓取数据

    java实现登录之后抓取数据

    这篇文章给大家分享了用JAVA实现在登陆以后抓取网站的数据的相关知识,有兴趣的朋友可以测试参考下。
    2018-07-07
  • Java设计模式之迭代器模式

    Java设计模式之迭代器模式

    这篇文章介绍了Java设计模式之迭代器模式,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-10-10
  • Maven中plugins与pluginManagement的区别说明

    Maven中plugins与pluginManagement的区别说明

    这篇文章主要介绍了Maven中plugins与pluginManagement的区别说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • java实现同步的几种方式(示例详解)

    java实现同步的几种方式(示例详解)

    这篇文章主要介绍了java实现同步的几种方式,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧
    2024-12-12
  • 案例讲解SpringBoot Starter的使用教程

    案例讲解SpringBoot Starter的使用教程

    SpringBoot中的starter是一种非常重要的机制,能够抛弃以前繁杂的配置,将其统一集成进starter,应用者只需要在maven中引入starter依赖,SpringBoot就能自动扫描到要加载的信息并启动相应的默认配置,本文通过案例讲解SpringBoot Starter的使用,感兴趣的朋友一起看看吧
    2023-12-12
  • Spring Cache抽象-使用SpEL表达式解析

    Spring Cache抽象-使用SpEL表达式解析

    这篇文章主要介绍了Spring Cache抽象-使用SpEL表达式解析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • 如何使用CountDownLatch同步java多线程

    如何使用CountDownLatch同步java多线程

    这篇文章主要介绍了如何使用CountDownLatch同步java多线程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08

最新评论