使用MapStruct和Lombok简化代码

简介: 使用MapStruct和Lombok简化代码

一、MapStruct介绍

这是什么?

MapStruct 是一个代码生成器,它极大地简化了基于约定而不是配置方法的 Java Bean 类型之间映射的实现。

生成的映射代码使用普通方法调用,因此快速、类型安全且易于理解。

为什么?

多层应用程序通常需要在不同的对象模型(例如实体和 DTO)之间进行映射。编写此类映射代码是一项繁琐且容易出错的任务。MapStruct旨在通过尽可能地自动化来简化这项工作。

与其他映射框架相比,MapStruct 在编译时生成 Bean 映射,从而确保高性能,允许快速的开发人员反馈和彻底的错误检查。

如何?

MapStruct是一个注释处理器,它插入到Java编译器中,可以在命令行构建(Maven,Gradle等)以及您首选的IDE中使用。

MapStruct使用合理的默认值,但在配置或实现特殊行为时会偏离您的道路。

官网:MapStruct – Java bean mappings, the easy way!

二、lombok介绍

Lombok是一个可以通过简单的注解形式来帮助我们简化消除一些必须有但显得很臃肿的Java代码的工具,通过使用对应的注解,可以在编译源码的时候生成对应的方法。官方地址:

https://projectlombok.org/,github地址:https://github.com/rzwitserloot/lombok

参考资料:史上最全 Lombok Features 注解详解

三、如何简化

1、导入依赖

<properties>
        <mapstruct.version>1.3.1.Final</mapstruct.version>
        <lombok.version>1.18.12</lombok.version>
</properties>
 
<dependencies>
 <!-- 引入 mapstruct 依赖 -->
        <dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct</artifactId>
            <version>${mapstruct.version}</version>
        </dependency>
 
        <!-- 引入 lombok 依赖 -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${lombok.version}</version>
            <scope>provided</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>
                        <!-- 引入 projectlombok -->
                        <path>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                            <version>${lombok.version}</version>
                        </path>
                    </annotationProcessorPaths>
                </configuration>
            </plugin>
        </plugins>
    </build>

2、使用示例

用户

package com.example.demo;
 
import lombok.*;
 
@Getter
@Setter
@Builder
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class User {
    /*用户ID*/
    private Long id;
    /*用户名*/
    private String username;
    /*密码*/
    private String password;
    /*电话*/
    private String phone;
    private Work work;
}

工作

package com.example.demo;
 
import lombok.*;
 
@Getter
@Setter
@Builder
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class Work {
    private Long id;
    private String workName;
}

传输需要的DTO

package com.example.demo;
 
import lombok.*;
 
@Getter
@Setter
@Builder
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class UserWorkDTO {
    /**
     * 用户id
     */
    private Long userId;
    /**
     * 用户名
     */
    private String name;
    /**
     * 岗位名
     */
    private String workName;
}

目标:将如下User和Work赋值给为UserWorkDTO

User(id=1, username=Spinoza, password=null, phone=1312313131, work=null)
Work(id=null, workName=码农)
UserWorkDTO(userId=1, name=Spinoza, workName=码农)


日常

 @Test
    void contextLoads1() {
        //新建用户
        User user=new User();
        user.setId(1L);
        user.setUsername("Spinoza");
        user.setPhone("1312313131");
        //新建工作
        Work work=new Work();
        work.setWorkName("码农");
        //给DTO赋值
        UserWorkDTO userWorkDTO=new UserWorkDTO();
        userWorkDTO.setUserId(user.getId());
        userWorkDTO.setName(user.getUsername());
        userWorkDTO.setWorkName(work.getWorkName());
        System.out.println(userWorkDTO.toString());
    }
   

使用lombok的@Builder简化代码

 
    @Test
    void contextLoads2() {
        //新建用户
        User user=User.builder().id(1L).username("Spinoza").phone("1312313131").build();
        //新建工作
        Work work=Work.builder().workName("码农").build();
        //给DTO赋值
        UserWorkDTO userWorkDTO=UserWorkDTO.builder().userId(user.getId()).name(user.getUsername()).workName(work.getWorkName()).build();
        System.out.println(userWorkDTO.toString());
    }
   

使用lombok的@Builder、MapStruct简化代码

package com.example.demo;
 
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;
import org.mapstruct.factory.Mappers;
/*定义转换接口*/
@Mapper
public interface UserWorkDTOConverter {
    //获取转换实例
    UserWorkDTOConverter INSTANCE = Mappers.getMapper(UserWorkDTOConverter.class);
    /*定义转换属性映射关系*/
    @Mappings({
            @Mapping(source = "user.id", target = "userId"),
            @Mapping(source = "user.username", target = "name"),
            @Mapping(source = "work.workName", target = "workName")
    })
    UserWorkDTO cover(User user,Work work);
}
 @Test
    void contextLoads3() {
        //新建用户
        User user=User.builder().id(1L).username("Spinoza").phone("1312313131").build();
        //新建工作
        Work work=Work.builder().workName("码农").build();
        //给DTO赋值
        UserWorkDTO cover = UserWorkDTOConverter.INSTANCE.cover(user, work);
        System.out.println(cover.toString());
    }

相关文章
|
1月前
|
Java
在 Java 中捕获和处理自定义异常的代码示例
本文提供了一个 Java 代码示例,展示了如何捕获和处理自定义异常。通过创建自定义异常类并使用 try-catch 语句,可以更灵活地处理程序中的错误情况。
59 1
|
22天前
|
Java
java小工具util系列4:基础工具代码(Msg、PageResult、Response、常量、枚举)
java小工具util系列4:基础工具代码(Msg、PageResult、Response、常量、枚举)
47 24
|
4天前
|
前端开发 Java 测试技术
java日常开发中如何写出优雅的好维护的代码
代码可读性太差,实际是给团队后续开发中埋坑,优化在平时,没有那个团队会说我专门给你一个月来优化之前的代码,所以在日常开发中就要多注意可读性问题,不要写出几天之后自己都看不懂的代码。
40 2
|
18天前
|
Java 编译器 数据库
Java 中的注解(Annotations):代码中的 “元数据” 魔法
Java注解是代码中的“元数据”标签,不直接参与业务逻辑,但在编译或运行时提供重要信息。本文介绍了注解的基础语法、内置注解的应用场景,以及如何自定义注解和结合AOP技术实现方法执行日志记录,展示了注解在提升代码质量、简化开发流程和增强程序功能方面的强大作用。
55 5
|
18天前
|
存储 算法 Java
Java 内存管理与优化:掌控堆与栈,雕琢高效代码
Java内存管理与优化是提升程序性能的关键。掌握堆与栈的运作机制,学习如何有效管理内存资源,雕琢出更加高效的代码,是每个Java开发者必备的技能。
46 5
|
21天前
|
Java API 开发者
Java中的Lambda表达式:简洁代码的利器####
本文探讨了Java中Lambda表达式的概念、用途及其在简化代码和提高开发效率方面的显著作用。通过具体实例,展示了Lambda表达式如何在Java 8及更高版本中替代传统的匿名内部类,使代码更加简洁易读。文章还简要介绍了Lambda表达式的语法和常见用法,帮助开发者更好地理解和应用这一强大的工具。 ####
|
24天前
|
Java API Maven
商汤人像如何对接?Java代码如何写?
商汤人像如何对接?Java代码如何写?
34 5
|
25天前
|
Java
在Java中实现接口的具体代码示例
可以根据具体的需求,创建更多的类来实现这个接口,以满足不同形状的计算需求。希望这个示例对你理解在 Java 中如何实现接口有所帮助。
39 1
|
17天前
|
安全 Java API
Java中的Lambda表达式:简化代码的现代魔法
在Java 8的发布中,Lambda表达式的引入无疑是一场编程范式的革命。它不仅让代码变得更加简洁,还使得函数式编程在Java中成为可能。本文将深入探讨Lambda表达式如何改变我们编写和维护Java代码的方式,以及它是如何提升我们编码效率的。
|
22天前
|
Java
Java将OffsetDateTime格式化为 yyyy-MM-dd HH:mm:ss 如何写代码?
Java将OffsetDateTime格式化为 yyyy-MM-dd HH:mm:ss 如何写代码?
26 0