【实用工具】对象转换工具MapStruct使用说明书

MapStruct是一个Java注解处理器,用于自动生成对象之间的映射代码,提供类型安全的bean映射。用户只需定义映射接口,MapStruct会在编译时生成其实现,避免了手动编写映射代码的繁琐。此外,文章还展示了如何处理名称和类型不一致的属性,日期格式转换,集合转换,以及如何进行多对一的数据映射,并提到了在Spring容器中的集成方式。
摘要由CSDN通过智能技术生成

MapStruct的介绍

MapStruct是一个Java注解处理器,用于生成类型安全的bean映射类。注解处理器是什么,可以参考我前段时间写的这篇博客:【实用工具】JSR-269 插入式注解处理器AbstractProcessor

您要做的就是定义一个映射器接口,该接口声明任何必需的映射方法。在编译期间,MapStruct将生成此接口的实现。此实现使用简单的Java方法调用在源对象和目标对象之间进行映射,即没有反射或类似内容。

Java实现

依赖引入

    <properties>
        <org.mapstruct.version>1.4.2.Final</org.mapstruct.version>
        <lombok.version>1.18.10</lombok.version>
    </properties>


	<dependencies>
       	<!-- ...-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${lombok.version}</version>
        </dependency>

        <dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct</artifactId>
            <version>${org.mapstruct.version}</version>
        </dependency>

        <dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct-processor</artifactId>
            <version>${org.mapstruct.version}</version>
        </dependency>

    </dependencies>

或者

    ...
    <properties>
        <org.mapstruct.version>1.5.2.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</version>
                <configuration>
                    <source>11</source> <!-- depending on your project -->
                    <target>11</target> <!-- depending on your project -->
                    <annotationProcessorPaths>
                        <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>
                        <!-- other annotation processors -->
                    </annotationProcessorPaths>
                </configuration>
            </plugin>
        </plugins>
	</build>

功能特性

名称和类型不一致

任务类

@Data
public class AppTask {

    private String name;

    private String title;
    
    private List<String> data;

    private Date createDate;

    private String createTime;
}

任务Vo类

@Data
public class AppTaskVo {

    private String taskName;

    private String title;

    private String dataStr;

    private String createTimeStr;

    private Date createTime;

}

可以看出除了title属性一致外,其他属性要么类型不一样,要么是名称不一样。

@Mapper(uses = ListStrFormat.class)
public interface AppTaskMapper {

    AppTaskMapper INSTANCES = Mappers.getMapper(AppTaskMapper.class);

    @Mappings({
            @Mapping(source = "name", target = "taskName"),
            @Mapping(source = "data", target = "dataStr"),
            @Mapping(source = "createDate", target = "createTimeStr", dateFormat = "yyyyMMdd"),
            @Mapping(target = "createTime", dateFormat = "yyyyMMdd")
    })
    AppTaskVo toTaskVo(AppTask appTask);
}

日期格式转换可以通过dateFormat设置,名称修改通过@Mapping指定sourcetarget。类型不一致可以通过@Mapper(uses = ListStrFormat.class),设置转换类。

public class ListStrFormat {

    public String toStr(List<String> list) {
        return list.stream().collect(Collectors.joining(","));
    }
}

测试效果

public class AppTaskTest {

    AppTaskMapper instances = AppTaskMapper.INSTANCES;

    @Test
    public void t1() {
        AppTask appTask = new AppTask();
        appTask.setName("123");
        appTask.setTitle("abc");
        appTask.setData(Arrays.asList("AA", "BB", "CC"));
        appTask.setCreateDate(new Date());
        appTask.setCreateTime("20230513");
        AppTaskVo appTaskVo = instances.toTaskVo(appTask);
        System.out.println(appTask);
        System.out.println(appTaskVo);
    }
}

控制台输出

AppTask(name=123, title=abc, createDate=Sun May 14 19:18:41 CST 2023, createTime=20230513, data=[AA, BB, CC])
AppTaskVo(taskName=123, title=abc, dataStr=AA,BB,CC, createTimeStr=20230514, createTime=Sat May 13 00:00:00 CST 2023)
集合转换

如果集合转换,添加方法如下

    List<AppTaskVo> toTaskVoList(List<AppTask> appTasks);
多转一

如果想要多个数据源复制到一个数据实体中,也是可以做到的。

记录类

@Data
public class AppRecord {

    private String name;
}

任务记录类

@Data
public class AppTaskRecordVo {

    private String taskName;

    private String recordName;
}

添加转换方法

    @Mappings({
            @Mapping(source = "appTask.name", target = "taskName"),
            @Mapping(source = "record.name", target = "recordName")
    })
    AppTaskRecordVo toTaskRecordVo(AppTask appTask, AppRecord record);

测试效果:

    public void t2() {
        AppTask appTask = new AppTask();
        appTask.setName("123");
        appTask.setTitle("abc");
        AppRecord record = new AppRecord();
        record.setName("爬山");
        AppTaskRecordVo appTaskRecordVo = instances.toTaskRecordVo(appTask, record);
        System.out.println(appTaskRecordVo);
    }

控制台输出:

AppTaskRecordVo(taskName=123, recordName=爬山)
指定更新对象

通过@MappingTarget来指定目标类是谁(谁的属性需要被更新)。@Mapping还是用来定义属性对应规则。

    void update(AppTask appTask, @MappingTarget AppTaskVo appTaskVo);
Spring容器管理

@Mapper(componentModel = “spring”),表示把当前Mapper类纳入spring容器。

@Mapper(componentModel ="spring")
public interface AppTaskMapper {
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 开发中,经常会遇到需要将一个类的属性转换为另一个类的属性的情况。这通常需要写很多重复的代码。为了减少这些重复的代码,可以使用 MapStruct 这个工具来处理恼人的 bean 转换MapStruct 是一个基于注解的 Java Bean 映射工具,它可以根据注解自动生成 Bean 映射代码。使用 MapStruct 可以让 bean 转换变得更加简单和高效。 接下来,我将介绍如何使用 MapStruct 处理 bean 转换。 1. 添加依赖 首先,需要在项目中添加 MapStruct 的依赖。可以在 pom.xml 文件中添加以下依赖: ```xml <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct</artifactId> <version>1.4.2.Final</version> </dependency> ``` 2. 创建转换接口 创建一个转换接口,用于定义源类和目标类之间的映射关系。例如,如果要将 User 类转换为 UserDto 类,可以创建以下接口: ```java @Mapper public interface UserMapper { UserMapper INSTANCE = Mappers.getMapper(UserMapper.class); UserDto toUserDto(User user); } ``` 在接口上添加 @Mapper 注解,表示这是一个 MapStruct 映射接口。在接口中定义一个 toUserDto 方法,用于将 User 类转换为 UserDto 类。 3. 编写转换代码 在 toUserDto 方法中,使用 MapStruct 提供的映射注解来指定属性的映射关系。例如,以下代码将 User 类的 name 属性映射到 UserDto 类的 username 属性: ```java @Mapping(source = "name", target = "username") UserDto toUserDto(User user); ``` 4. 执行转换 创建一个 User 对象,并将其转换为 UserDto 对象: ```java User user = new User("Tom", 18); UserDto userDto = UserMapper.INSTANCE.toUserDto(user); ``` 使用 MapStruct 处理 bean 转换非常简单。只需定义一个转换接口,并在其中使用映射注解指定属性的映射关系,就可以自动生成 bean 映射代码。这样可以大大减少编写重复代码的工作量,提高开发效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值