Java实体映射工具MapStruct
发布日期:2021-05-07 14:47:08 浏览次数:13 分类:精选文章

本文共 3322 字,大约阅读时间需要 11 分钟。

Java 实体映射工具 MapStruct


1. Entity、VO、DTO 的认识与应用

在 Java 开发中,Entity、VO(Value Object)和 DTO(Data Transfer Object)是数据传输和持久化中的三种核心概念,各自承担着不同的角色。

  • Entity

    Entity 是与数据库对应的实体类,每个字段都映射到数据库中的对应字段。它是数据持久化的核心对象,负责与数据库进行 CRUD 操作。

  • VO

    VO 是面向前端或其他无持久化需求的数据传输类。它的字段与前台页面或其他系统的数据需求完全一致,主要用于数据展示和传输。

  • DTO

    DTO 是将数据从 Entity 转换为 VO,或者从 VO 转换为 Entity 的中间对象。DTO 中的字段应是 Entity 或 VO 的子集,通常用于数据的安全转换或特定业务逻辑处理。

  • 示例:

    • 前台页面 需要三个字段:name、pass、age。
    • 数据库表 只有 name 和 pass 两个字段。
    • VO 需要三个字段:name、pass、age。
    • Entity 则只有 name 和 pass 两个字段。

    在业务逻辑中,若需要验证 age 大于 20 的条件时,可以通过 DTO 进行判断和转换:

  • 从 VO 中提取 name 和 pass,放入 DTO。
  • 将 DTO 转换为 Entity,再持久化到数据库。

  • 2. MapStruct 简介

    MapStruct 是一个强大的 Java 属性映射工具,专门解决对象与对象之间的数据转换问题。它通过注解驱动的方式,简化了字段映射、日期转换、表达式执行等复杂操作。

    依赖管理

    在 Maven 项目中引入 MapStruct 依赖:

    1.2.0.Final
    org.mapstruct
    mapstruct-jdk8
    ${mapstruct.version}
    org.mapstruct
    mapstruct-processor
    ${mapstruct.version}

    3. MapStruct 的基本使用

    3.1 定义映射接口

    @Mapperpublic interface PersonConverter {    PersonConverter INSTANCE = Mappers.getMapper(PersonConverter.class);    @Mappings({        @Mapping(source = "birthday", target = "birth"),        @Mapping(source = "birthday", target = "birthDateFormat", dateFormat = "yyyy-MM-dd HH:mm:ss"),        @Mapping(target = "birthExpressionFormat", expression = "java(org.apache.commons.lang3.time.DateFormatUtils.format(person.getBirthday(), \"yyyy-MM-dd HH:mm:ss\"))"),        @Mapping(source = "user.age", target = "age"),        @Mapping(target = "email", ignore = true)    })    PersonDTO domain2dto(Person person);    List
    domain2dto(List
    people);}

    3.2 映射实现

    MapStruct 会自动生成实现类,放在 target/classes 目录下。例如,PersonConverterImpl 会自动实现 PersonConverter 接口。

    3.3 单元测试

    public class PersonConverterTest {    @Test    public void test() {        Person person = new Person(1L, "zhige", "zhige.me@gmail.com", new Date(), new User(1));        PersonDTO personDTO = PersonConverter.INSTANCE.domain2dto(person);        // Assert 相关操作...    }}

    4. MapStruct 的高级功能

    4.1 多对一映射

    @Mapperpublic interface ItemConverter {    ItemConverter INSTANCE = Mappers.getMapper(ItemConverter.class);    @Mappings({        @Mapping(source = "sku.id", target = "skuId"),        @Mapping(source = "sku.code", target = "skuCode"),        @Mapping(source = "sku.price", target = "skuPrice"),        @Mapping(source = "item.id", target = "itemId"),        @Mapping(source = "item.title", target = "itemName")    })    SkuDTO domain2dto(Item item, Sku sku);}

    4.2 自定义方法

    @Mapperpublic interface PersonConverter {    PersonConverter INSTANCE = Mappers.getMapper(PersonConverter.class);    default PersonDTO personToPersonDTO(Person person) {        // 自定义映射逻辑...    }    default Boolean convert2Bool(Integer value) {        return value != null && value >= 1;    }    default Integer convert2Int(Boolean value) {        return value != null ? value ? 1 : 0 : null;    }}

    4.3 Spring 集成

    @Mapper(componentModel = "spring")public interface PersonConverter {    // 映射逻辑类似于上述}

    5. MapStruct 的注解关键词

    • @Mapper:标记为 MapStruct 映射接口。
    • @Mappings:配置多个字段映射。
    • @MappingTarget:用于更新目标对象。
    • @InheritConfiguration:继承已有配置。
    • dateFormat:日期格式转换。
    • expression:表达式转换。

    通过以上内容,可以清晰地理解 MapStruct 的核心功能及其在实际项目中的应用。

    上一篇:dubbo项目拆分结构
    下一篇:Gradle快速入门

    发表评论

    最新留言

    不错!
    [***.144.177.141]2025年03月29日 07时25分27秒