千锋教育-做有情怀、有良心、有品质的职业教育机构

手机站
千锋教育

千锋学习站 | 随时随地免费学

千锋教育

扫一扫进入千锋手机站

领取全套视频
千锋教育

关注千锋学习站小程序
随时随地免费学习课程

当前位置:首页  >  技术干货  > 详解org.mapstruct

详解org.mapstruct

来源:千锋教育
发布人:xqq
时间: 2023-11-24 08:45:18 1700786718

一、MapStruct简介

MapStruct是一个Java注解处理器,用于生成类型安全的Bean映射代码。使用MapStruct,我们可以轻松地编写用于将类型A的实例转换为类型B的实例的映射器类,而无需手写大量重复的代码。因此,MapStruct旨在解决Java中类型转换代码的冗长和重复问题,提高开发效率,同时保持代码质量。

二、MapStruct的特点

1. 支持注解引导配置,通常情况下不需要额外配置文件。

2. 通过生成结果提供了良好的性能和类型安全性。

3. 可扩展,支持自定义转换器。

4. 通过@Mapper注解轻松定义类型转换规则。该注解包括许多属性,这些属性控制了生成的映射器类的特性,如命名策略、映射解析策略等。

三、MapStruct的使用

3.1 安装

MapStruct可以通过maven进行安装,只需在项目的pom.xml文件中添加以下依赖即可:



    org.mapstruct
    mapstruct-jdk8
    1.4.2.Final

3.2 定义映射器类

在MapStruct中,我们需要定义一个接口,用@Mapper注解标记该接口以及该接口中的抽象方法作为Mapper的映射规则。


@Mapper
public interface UserMapper {
    UserDto UserToUserDto(User user);
    User UserDtoToUser(UserDto userDto);
}

上述代码定义了一个UserMapper接口,其中包含两个抽象方法。这些方法定义了两种类型之间的转换,即User和UserDto。通过定义这个Mapper接口,MapStruct将会自动生成UserMapperImpl类作为UserMapper接口实现类。

3.3 使用映射器类

一旦我们定义了Mapper接口,就可以在应用程序中使用它了。在示例中,我们要将User实例转换为UserDto实例,只需要通过注入UserMapper来执行转换。例如:


@Autowired
private UserMapper userMapper;

public void someMethod(User user) {
    UserDto userDto = userMapper.UserToUserDto(user);
    // ...
}

3.4 高级映射

MapStruct还提供了高级的映射功能,如映射一个具体类型到另一个具体类型、映射字段注入等。下面是一些常见的高级映射场景的代码示例。

3.4.1 映射一个具体类型到另一个具体类型

在MapStruct中,我们也可以映射一个具体类型,而不是只与接口相关。下面是映射一个具体类型的示例代码:


@Mapper
public class UserMapper {
    public static final UserMapper INSTANCE = Mappers.getMapper(UserMapper.class);

    public UserDto UserToUserDto(User user) {
        return new UserDto(
                user.getUserId(),
                user.getFirstName() + " " + user.getLastName(),
                user.getEmail()
        );
    }
}

在此示例中,我们使用静态的UserMapper.INSTANCE方法来获取UserMapper的实例。然后,我们定义了将User映射到UserDto的方法。请注意,在这个方法中,我们直接将属性设置为UserDto实例的构造函数的参数,而不是通过对象映射获取属性。

3.4.2 映射字段注入

在某些情况下,我们可能需要将目标对象注入到Mapper中以进行进一步转换。这种情况下,我们可以使用@MappingTarget注解。例如,假设我们有以下两个类:


public class User {
    private String firstName;
    private String lastName;
    private String email;

    // getters and setters
}

public class UserDto {
    private String name;
    private String email;

    // getters and setters
}

我们需要映射User对象的firstName和lastName属性到UserDto类的name属性中。然而,UserDto的name属性需要以"firstName lastName"的格式设置。为了实现这种转换,我们可以使用以下代码:


@Mapper
public interface UserMapper {
    void userToUserDto(User user, @MappingTarget UserDto userDto);

    @AfterMapping
    default void setFullName(@MappingTarget UserDto userDto, User user) {
        userDto.setName(user.getFirstName() + " " + user.getLastName());
    }
}

在这个映射器类中,我们定义了一个void userToUserDto(User user, @MappingTarget UserDto userDto)方法来映射User到UserDto。我们也定义了一个@AfterMapping注解方法setFullName(),该方法在映射完成后执行,并将firstName和lastName属性组合为name属性。请注意,@MappingTarget注解用于标识目标对象,这里是UserDto对象,以便我们可以将值注入到目标对象中。

3.4.3 映射集合类型

MapStruct也支持映射集合类型。例如,在以下场景中,我们需要将User集合映射为UserDto集合:


List userList = ... ;
List userDtoList = UserMapper.INSTANCE.userListToUserDtoList(userList);

以下是映射器方法的代码示例:


@Mapper
public interface UserMapper {
    List userListToUserDtoList(List userList);
}

四、总结

MapStruct是一个强大的类型安全Java bean映射框架。它使用注解处理器在编译时生成类型安全的映射代码,有助于减少手动处理重复的转换代码,提高代码质量和开发效率。在我们使用MapStruct将类转换为另一个类时,它可以为我们提供良好的性能和类型安全性。

声明:本站稿件版权均属千锋教育所有,未经许可不得擅自转载。
10年以上业内强师集结,手把手带你蜕变精英
请您保持通讯畅通,专属学习老师24小时内将与您1V1沟通
免费领取
今日已有369人领取成功
刘同学 138****2860 刚刚成功领取
王同学 131****2015 刚刚成功领取
张同学 133****4652 刚刚成功领取
李同学 135****8607 刚刚成功领取
杨同学 132****5667 刚刚成功领取
岳同学 134****6652 刚刚成功领取
梁同学 157****2950 刚刚成功领取
刘同学 189****1015 刚刚成功领取
张同学 155****4678 刚刚成功领取
邹同学 139****2907 刚刚成功领取
董同学 138****2867 刚刚成功领取
周同学 136****3602 刚刚成功领取
相关推荐HOT