Java高效映射工具MapStruct的使用示例

 更新时间:2023年12月25日 10:38:30   作者:一只爱撸猫的程序猿  
MapStruct 是一个 Java 注解处理器,用于在不同 Java Beans 或数据传输对象(DTOs)之间自动生成类型安全的映射代码,这是一个编译时映射框架,意味着它利用注解在编译时生成代码,本文将给大家介绍一下Java注解处理器MapStruct的使用示例,需要的朋友可以参考下

引言

MapStruct 是一个 Java 注解处理器,用于在不同 Java Beans 或数据传输对象(DTOs)之间自动生成类型安全的映射代码。这是一个编译时映射框架,意味着它利用注解在编译时生成代码,从而提高了性能和减少了运行时的开销。

它适用于 Java 8 和更高版本。以下是一些 MapStruct 的基本使用示例:

1. 基本映射

假设你有两个简单的类 PersonPersonDTO,需要将 Person 实体映射到 PersonDTO 数据传输对象。

Person.java

public class Person {
    private String name;
    private int age;
    // getters and setters
}

PersonDTO.java

public class PersonDTO {
    private String name;
    private int age;
    // getters and setters
}

PersonMapper.java

@Mapper
public interface PersonMapper {
    PersonMapper INSTANCE = Mappers.getMapper(PersonMapper.class);
    PersonDTO personToPersonDTO(Person person);
}

2. 复杂类型映射

如果你的对象包含复杂类型或自定义类型,MapStruct 也可以处理这些。

Address.java

public class Address {
    private String street;
    private String city;
    // getters and setters
}

Person.java (现在包含 Address)

public class Person {
    private String name;
    private int age;
    private Address address;
    // getters and setters
}

PersonDTO.java (同样包含 Address)

public class PersonDTO {
    private String name;
    private int age;
    private String street;
    private String city;
    // getters and setters
}

PersonMapper.java

@Mapper
public interface PersonMapper {
    PersonMapper INSTANCE = Mappers.getMapper(PersonMapper.class);
    
    @Mapping(source = "address.street", target = "street")
    @Mapping(source = "address.city", target = "city")
    PersonDTO personToPersonDTO(Person person);
}

3. 使用表达式

有时,你可能需要在映射过程中使用自定义逻辑。MapStruct 允许你使用 Java 表达式来实现这一点。

Person.java

public class Person {
    private String firstName;
    private String lastName;
    // getters and setters
}

PersonDTO.java

public class PersonDTO {
    private String fullName;
    // getters and setters
}

PersonMapper.java

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

    @Mapping(expression = "java(person.getFirstName() + ' ' + person.getLastName())", target = "fullName")
    PersonDTO personToPersonDTO(Person person);
}

4. 使用自定义方法

在某些情况下,你可能需要自定义映射逻辑。你可以在映射器接口中定义自己的方法来实现这一点。

Person.java

public class Person {
    private String birthdate; // 假设这是一个字符串
    // getters and setters
}

PersonDTO.java

public class PersonDTO {
    private LocalDate birthdate; // 在 DTO 中,我们使用 LocalDate
    // getters and setters
}

PersonMapper.java

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

    @Mapping(target = "birthdate", source = "birthdate", dateFormat = "yyyy-MM-dd")
    PersonDTO personToPersonDTO(Person person);

    default LocalDate stringToLocalDate(String date) {
        return LocalDate.parse(date, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
    }
}

5. 映射集合

MapStruct 也能很好地处理集合映射。

PersonMapper.java

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

    List<PersonDTO> personsToPersonDTOs(List<Person> persons);
}

6. 使用依赖注入

如果你使用 Spring 或类似框架,可以将 MapStruct 与依赖注入框架结合使用。

PersonMapper.java

@Mapper(componentModel = "spring")
public interface PersonMapper {
    PersonDTO personToPersonDTO(Person person);
}

使用 componentModel = "spring",MapStruct 将生成一个 Spring 组件,可以被注入到你的服务中。

7. 更新现有对象

MapStruct 也可以用于更新现有对象,而不是创建新的。

PersonMapper.java

@Mapper
public interface PersonMapper {
    void updatePersonFromDTO(PersonDTO personDto, @MappingTarget Person person);
}

这个方法将会根据 PersonDTO 中的数据更新一个已存在的 Person 对象,而不是创建一个新的。

8. 多源映射

你可以从多个源对象映射到一个目标对象。

Address.java

public class Address {
    private String city;
    // getters and setters
}

PersonDTO.java

public class PersonDTO {
    private String name;
    private String city;
    // getters and setters
}

PersonMapper.java

@Mapper
public interface PersonMapper {
    @Mapping(source = "person.name", target = "name")
    @Mapping(source = "address.city", target = "city")
    PersonDTO personAndAddressToDTO(Person person, Address address);
}

总结

MapStruct 的主要优点是它提供了一种高效、类型安全且易于使用的方式来自动化对象间的数据映射。这使得它成为处理 Java 应用中数据转换的理想选择,尤其是在涉及复杂对象和多层架构的场景中。通过减少手写的样板代码和提供清晰的映射定义,MapStruct 可以帮助开发人员节省时间,减少错误,并提高代码的可维护性。

以上就是Java注解处理器MapStruct的使用示例的详细内容,更多关于Java MapStruct使用的资料请关注脚本之家其它相关文章!

相关文章

  • SpringBoot使用CORS实现无缝跨域的方法实现

    SpringBoot使用CORS实现无缝跨域的方法实现

    CORS 是一种在服务端设置响应头部信息的机制,允许特定的源进行跨域访问,本文主要介绍了SpringBoot使用CORS实现无缝跨域的方法实现,具有一定的参考价值,感兴趣的可以了解一下
    2023-10-10
  • Java实现Dijkstra输出最短路径的实例

    Java实现Dijkstra输出最短路径的实例

    这篇文章主要介绍了Java实现Dijkstra输出最短路径的实例的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下
    2017-09-09
  • java面试常见模式问题---代理模式

    java面试常见模式问题---代理模式

    代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息
    2021-06-06
  • java中@JSONField和@JsonProperty注解的使用说明及对比

    java中@JSONField和@JsonProperty注解的使用说明及对比

    @JSONField与@JsonProperty隶属两个不同的包,前者是阿里系的fastjson包,后者是spring boot官方使用的jackson包,本文主要介绍了java中@JSONField和@JsonProperty注解的使用说明及对比,感兴趣的可以了解一下
    2023-11-11
  • 基于SpringBoot加载Mybatis的TypeAlias问题

    基于SpringBoot加载Mybatis的TypeAlias问题

    这篇文章主要介绍了解决SpringBoot加载Mybatis的TypeAlias问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • 一篇文章搞定数据库连接池

    一篇文章搞定数据库连接池

    数据库连接池在编写应用服务是经常需要用到的模块,太过频繁的连接数据库对服务性能来讲是一个瓶颈,使用缓冲池技术可以来消除这个瓶颈,本文就来介绍Java常见的几种,感兴趣的可以了解一下
    2021-07-07
  • Java使用Junit4.jar进行单元测试的方法

    Java使用Junit4.jar进行单元测试的方法

    今天通过本文给大家介绍Java使用Junit4.jar进行单元测试的方法,本文通过图文实例相结合给大家介绍的非常详细,需要的朋友参考下吧
    2021-11-11
  • Java8 Lambda表达式详解及实例

    Java8 Lambda表达式详解及实例

    这篇文章主要介绍了Java8 Lambda表达式详解的相关资料,需要的朋友可以参考下
    2016-09-09
  • 解决Tomcat启动报异常java.lang.ClassNotFoundException问题

    解决Tomcat启动报异常java.lang.ClassNotFoundException问题

    这篇文章主要介绍了解决Tomcat启动报异常java.lang.ClassNotFoundException问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • JavaIO字符操作和对象操作示例详解

    JavaIO字符操作和对象操作示例详解

    这篇文章主要为大家介绍了JavaIO字符操作和对象操作示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02

最新评论