mapstruct

简介: mapstruct

你泛起山川,碧波里的人不是我。——《慕容雪》

首先按照官方文档引入GAV,但要注意和lombok有版本冲突问题,因此我选择这个版本:

这里放上主要配置

<properties>
    <java.version>1.8</java.version>
    <lombok.version>1.18.10</lombok.version>
    <mapstruct.version>1.3.0.Final</mapstruct.version>
</properties>
<dependencies>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>${lombok.version}</version>
        <scope>provided</scope>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.mapstruct</groupId>
        <artifactId>mapstruct</artifactId>
        <version>${mapstruct.version}</version>
    </dependency>
</dependencies>
<plugins>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.8.1</version>
        <configuration>
            <source>1.8</source>
            <target>1.8</target>
            <encoding>UTF-8</encoding>
            <annotationProcessorPaths>
                <path>
                    <groupId>org.projectlombok</groupId>
                    <artifactId>lombok</artifactId>
                    <version>${lombok.version}</version>
                </path>
                <path>
                    <groupId>org.mapstruct</groupId>
                    <artifactId>mapstruct-processor</artifactId>
                    <version>${mapstruct.version}</version>
                </path>
            </annotationProcessorPaths>
        </configuration>
    </plugin>
</plugins>


然后我准备两个实体类进行转换

package com.ruben.simplescaffold.entity;
import lombok.*;
import lombok.experimental.Accessors;
/**
 * 用户
 *
 * @author <achao1441470436@gmail.com>
 * @since 2021/7/30 10:22
 */
@Data
@ToString
@Builder
@Accessors(chain = true)
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class UserDetail extends BaseEntity<UserDetail> {
    private static final long serialVersionUID = 1L;
    /**
     * 用户名
     */
    private String username;
    /**
     * 密码
     */
    private String password;
}

以及

package com.ruben.simplescaffold.pojo.vo;
import java.io.Serializable;
import lombok.Data;
/**
 * 用户VO
 *
 * @author <achao1441470436@gmail.com>
 * @since 2022/3/23 19:20
 */
@Data
public class UserVO implements Serializable {
    private static final long serialVersionUID = -6541515410807361292L;
    private String uname;
    private String pwd;
}

开始编写Mapper,注意此处注解导入的依赖为mapStruct

package com.ruben.simplescaffold.mapper.mapstruct;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;
import com.ruben.simplescaffold.entity.UserDetail;
import com.ruben.simplescaffold.pojo.vo.UserVO;
/**
 * 用户mapstruct转换mapper
 *
 * @author <achao1441470436@gmail.com>
 * @since 2022/3/23 19:18
 */
@Mapper
public interface MapUserMapper {
    MapUserMapper INSTANCE = Mappers.getMapper(MapUserMapper.class);
    @Mapping(source = "username", target = "uname")
    @Mapping(source = "password", target = "pwd")
    UserVO convertPoToVo(UserDetail userDetail);
}

当然如果你想注入到spring容器中,可以指定@Mapper(componentModel = "spring")

然后编写测试类测试一下

package com.ruben.simplescaffold;
import org.junit.Test;
import org.junit.jupiter.api.Assertions;
import com.ruben.simplescaffold.entity.UserDetail;
import com.ruben.simplescaffold.mapper.mapstruct.MapUserMapper;
import com.ruben.simplescaffold.pojo.vo.UserVO;
/**
 * @author <achao1441470436@gmail.com>
 * @since 2022/3/23 19:22
 */
public class MapUserMapperTest {
    @Test
    public void convertPoToVoTest() {
        UserVO userVO = MapUserMapper.INSTANCE.convertPoToVo(UserDetail.builder().username("ruben").password("vampire").build());
        Assertions.assertEquals("ruben", userVO.getUname());
        Assertions.assertEquals("vampire", userVO.getPwd());
    }
}

测试通过

并且可以在这里看到我们生成的代码

我们还可以下载idea插件

下载了,我们就可以按住ctrl鼠标移动到@Mapping注解的sourcetarget上,还能点进去

相关文章
|
安全 IDE Java
MapStruct - 原理讲解
MapStruct - 原理讲解
1269 2
MapStruct - 原理讲解
|
Java Maven
MapStruct - Lombok & Maven 版本关系
MapStruct - Lombok & Maven 版本关系
1810 0
|
2月前
|
Java 数据库连接 Maven
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和MyBatis Generator,使用逆向工程来自动生成Java代码,包括实体类、Mapper文件和Example文件,以提高开发效率。
142 2
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。
|
6月前
|
安全 IDE Java
使用MapStruct和Lombok简化代码
使用MapStruct和Lombok简化代码
188 2
|
7月前
|
Java 数据库连接 数据库
Spring整合Mybatis、Spring整合JUnit
Spring整合Mybatis、Spring整合JUnit
45 1
Spring整合Mybatis、Spring整合JUnit
|
安全 Java Maven
MapStruct使用
MapStruct使用
|
XML Java 关系型数据库
Spring整合篇:Mybatis
Spring整合Mybatis
142 0
|
存储 SQL Java
90天Java(3)---mybatis与mybatis plus-2
此博文是学习吕一明老师《90天Java进阶训练营二期》的笔记总结,接上一篇博文。我们接着来介绍和分析MyBatis 本次分析中涉及到的代码和数据库表均放在GitHub上,地址:源码地址
247 0
90天Java(3)---mybatis与mybatis plus-2
|
SQL XML 存储
90天Java(3)---mybatis与mybatis plus-1
此博文是学习吕一明老师《90天Java进阶训练营二期》的笔记总结,这篇博文我们将主要介绍MyBatis和MyBatis plus的使用以及相关源码。 本次分析中涉及到的代码和数据库表均放在GitHub上,地址:源码地址
184 0
90天Java(3)---mybatis与mybatis plus-1