Exploring
首页
  • Java

    • 面向对象的思想OOP
    • 浅谈Java反射原理
    • endorsed覆盖JDK中的类
  • 认证与授权

    • LDAP概念和原理介绍
    • OAuth2介绍
  • Impala

    • Impala 介绍
  • MySQL

    • 关于MySQL的一些面试题
    • 解决MySQL不到中文数据
    • 数据库之事务与实现原理
  • Oracle

    • oracle的表空间,用户管理,表操作,函数
    • oracle的查询、视图、索引
    • plsql简单入门
  • Redis

    • 数据类型详解
    • 跳越表
    • 数据持久化的两种方式
  • 共识算法

    • gossip
  • RPC

    • GRPC初识与快速入门
    • ProtocolBuffer基本语法
  • RabbitMQ

    • RabbitMQ入门程序之HelloWorld
    • RabbitMQ之工作模式
  • Zookeeper

    • Zookeeper一文入门
  • Docker

    • Docker入门初体验
  • Maven

    • 把自己的包到Maven中央仓库
    • Maven之自定义插件
  • Nginx

    • nginx的安装
    • nginx的配置文件
    • nignx 的变量
  • Tomcat

    • Servlet3通过SPI进行注册组件
  • Vagrant

    • vagrant 初始化
    • vagrant 常用配置
    • vagrant 自己制作 box
  • Linux

    • 启动方式 Systemd
    • 后台服务
    • 防火墙与 Iptables
  • 设计模式

    • 设计模式-代理
    • 设计模式-单例模式
    • 设计模式-迭代器
  • 分布式

    • CAP 理论
  • 数据结构

    • 数据结构之堆Heap
    • 数据结构之哈希表
    • 数据结构之队列
  • 计算机网络

    • HTTP与HTTPS详解
    • 浅谈DNS协议
    • ISP中的网络层
  • 算法

    • 常用查找算法及Java实现
    • 常用排序算法及Java实现
    • 迪杰斯特拉算法
  • 操作系统

    • 操作系统之进程调度算法
    • 操作系统之进程通讯IPC
    • 操作系统之内存管理
  • 抓包

    • 生成安卓系统证书
  • 加解密

    • 常见加密算法
    • 公开秘钥基础知识
    • RSA 解析
  • Windows

    • scoop 包管理
    • windows-terminal 配置
    • 增强 PowerShell
归档
Github (opens new window)
首页
  • Java

    • 面向对象的思想OOP
    • 浅谈Java反射原理
    • endorsed覆盖JDK中的类
  • 认证与授权

    • LDAP概念和原理介绍
    • OAuth2介绍
  • Impala

    • Impala 介绍
  • MySQL

    • 关于MySQL的一些面试题
    • 解决MySQL不到中文数据
    • 数据库之事务与实现原理
  • Oracle

    • oracle的表空间,用户管理,表操作,函数
    • oracle的查询、视图、索引
    • plsql简单入门
  • Redis

    • 数据类型详解
    • 跳越表
    • 数据持久化的两种方式
  • 共识算法

    • gossip
  • RPC

    • GRPC初识与快速入门
    • ProtocolBuffer基本语法
  • RabbitMQ

    • RabbitMQ入门程序之HelloWorld
    • RabbitMQ之工作模式
  • Zookeeper

    • Zookeeper一文入门
  • Docker

    • Docker入门初体验
  • Maven

    • 把自己的包到Maven中央仓库
    • Maven之自定义插件
  • Nginx

    • nginx的安装
    • nginx的配置文件
    • nignx 的变量
  • Tomcat

    • Servlet3通过SPI进行注册组件
  • Vagrant

    • vagrant 初始化
    • vagrant 常用配置
    • vagrant 自己制作 box
  • Linux

    • 启动方式 Systemd
    • 后台服务
    • 防火墙与 Iptables
  • 设计模式

    • 设计模式-代理
    • 设计模式-单例模式
    • 设计模式-迭代器
  • 分布式

    • CAP 理论
  • 数据结构

    • 数据结构之堆Heap
    • 数据结构之哈希表
    • 数据结构之队列
  • 计算机网络

    • HTTP与HTTPS详解
    • 浅谈DNS协议
    • ISP中的网络层
  • 算法

    • 常用查找算法及Java实现
    • 常用排序算法及Java实现
    • 迪杰斯特拉算法
  • 操作系统

    • 操作系统之进程调度算法
    • 操作系统之进程通讯IPC
    • 操作系统之内存管理
  • 抓包

    • 生成安卓系统证书
  • 加解密

    • 常见加密算法
    • 公开秘钥基础知识
    • RSA 解析
  • Windows

    • scoop 包管理
    • windows-terminal 配置
    • 增强 PowerShell
归档
Github (opens new window)
  • Java

    • 基础

    • 并发与多线程

    • 日志系统

    • 单元测试

    • JVM

    • Spring

    • SpringBoot

    • 一些工具

      • 用Jcommander打造自己的Java的命令行工具
      • Model高效转换神器之MapStruct
        • 简介
        • 配置依赖
        • 入门案例
        • 不同的属性名
        • 属性嵌套
        • 相关链接
      • Java应用诊断利器Arthas
      • Jmeter进行并发测试之快速开始
  • 语言
  • Java
  • 一些工具
unclezs
2020-12-06
0
目录

Model高效转换神器之MapStruct

# 简介

MapStruct是一种注释处理器,用于生成类型安全,高性能和无依赖的Bean映射代码。解决了我们日常在各种Vo、Dto、Model之间的转换难题。

有人问不是有BeanUtil了吗,为什么还要这么累赘的写这样的转换器?

  1. BeanUtil原理是利用反射,所以效率低,MapStruct是在编译时生成代码效率高
  2. BeanUtil的只是名称类型相同的的转换比较方便
  3. MapStruct支持各种复杂类型的转换。

# 配置依赖

<?xml version="1.0" encoding="UTF-8"?>
<properties>
    <org.mapstruct.version>1.4.1.Final</org.mapstruct.version>
</properties>
<dependencies>
    <dependency>
        <groupId>org.mapstruct</groupId>
        <artifactId>mapstruct</artifactId>
        <version>${org.mapstruct.version}</version>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.1>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
                <annotationProcessorPaths>
                    <!--如果有用Lombok需要添加下面这个,注意顺序-->
                    <path>
                        <groupId>org.projectlombok</groupId>
                        <artifactId>lombok</artifactId>
                        <version>${lombok.version}</version>
                    </path>
                    <path>
                        <groupId>org.mapstruct</groupId>
                        <artifactId>mapstruct-processor</artifactId>
                        <version>${org.mapstruct.version}</version>
                    </path>
                </annotationProcessorPaths>
            </configuration>
        </plugin>
    </plugins>
</build>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38

# 入门案例

用了lombok,不用也一样,自己写getter、setter

示例代码在samples-mapstruct (opens new window)

@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserDto {
  private String age;
  private String name;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
  private String age;
  private String name;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

编写Mapper

@Mapper
public interface UserMapper {
  UserMapper INSTANCE = Mappers.getMapper(UserMapper.class);
  User userDto2User(UserDto userDto);
  UserDto userDto2User(User user);
}
1
2
3
4
5
6

测试代码

@Slf4j
public class MapStructSample {
  public static void main(String[] args) {
    User user = new User("123", "uncle");
    UserDto userDto = UserMapper.INSTANCE.userDto2User(user);
    log.info("{}",userDto);
  }
}
1
2
3
4
5
6
7
8

输出

18:20:14.886 [main] INFO com.unclezs.samples.mapstruct.MapStructSample - UserDto(age=123, name=uncle)
1

可以看到生成了代码

# 不同的属性名

@Data
@AllArgsConstructor
@NoArgsConstructor
public class PersonDto {
  private String cname;
}

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Person {
  private String name;
}
@Mapper
public interface PersonMapper {
  PersonMapper INSTANCE = Mappers.getMapper(PersonMapper.class);

  @Mapping(source = "name",target = "cname")
  PersonDto personToPersonDto(Person user);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

# 属性嵌套

@Data
@AllArgsConstructor
@NoArgsConstructor
public class PersonVo {
  private String cname;
  private String userName;
  private String userAge;
}

@Mapper
public interface PersonMapper {
  PersonMapper INSTANCE = Mappers.getMapper(PersonMapper.class);

  @Mapping(source = "name", target = "cname")
  PersonDto personToPersonDto(Person user);

  @Mapping(source = "user",target = "guest")
  @Mapping(source = "name",target = "cname")
  PersonDto personToPersonDtoNested(Person person);

  @Mapping(source = "user.name",target = "userName")
  @Mapping(source = "user.age",target = "userAge")
  @Mapping(source = "name",target = "cname")
  PersonVo personToPersonVoNestedProperty(Person person);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

测试

  @Test
  public void testNested() {
    Person person = new Person();
    person.setName("uncle");
    User user = new User("123", "uncle");
    person.setUser(user);
    PersonDto personDto = PersonMapper.INSTANCE.personToPersonDtoNested(person);
    Assert.assertEquals("uncle", personDto.getCname());
    Assert.assertEquals("uncle", personDto.getGuest().getName());
  }

  @Test
  public void testNestedToProperty() {
    Person person = new Person();
    person.setName("uncle");
    User user = new User("123", "uncle");
    person.setUser(user);
    PersonVo personVo = PersonMapper.INSTANCE.personToPersonVoNestedProperty(person);
    Assert.assertEquals("uncle", personVo.getCname());
    Assert.assertEquals("uncle", personVo.getUserName());
  }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

# 相关链接

官方文档 (opens new window) github官方地址 (opens new window)

在 GitHub 编辑此页 (opens new window)
上次更新: 2024/02/25, 12:11:11
用Jcommander打造自己的Java的命令行工具
Java应用诊断利器Arthas

← 用Jcommander打造自己的Java的命令行工具 Java应用诊断利器Arthas→

Theme by Vdoing | Copyright © 2018-2024 unclezs
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式