MapStruct 的用法

Administrator
发布于 2025-06-19 / 2 阅读
0
0

MapStruct 的用法

1. MapStruct 是什么?

MapStruct 是一个 Java 对象映射框架,可以自动生成类型转换代码,避免手写 BeanUtils.copyProperties(),提升开发效率和代码可读性。

你的代码是如何转换的?

  1. @Mapper 注解告诉 MapStruct 这是一个转换接口

  2. INSTANCE = Mappers.getMapper(ArticulationStoreConvert.class);

    • MapStruct 自动实现接口,并创建 INSTANCE 实例。

    • 你可以直接用 ArticulationStoreConvert.INSTANCE.po2Vo(po); 来转换。

  3. 定义了两个转换方法:

    • po2Vo(ArticulationStorePO po); 单个对象转换

    • poList2VoList(List<ArticulationStorePO> poList); 列表转换


2. MapStruct 自动生成的代码

当你编译项目时,MapStruct 会自动生成 ArticulationStoreConvertImpl.java,里面会有类似下面的代码:

public class ArticulationStoreConvertImpl implements ArticulationStoreConvert {
    
    @Override
    public ListQuestionVO po2Vo(ArticulationStorePO po) {
        if (po == null) {
            return null;
        }
        
        ListQuestionVO vo = new ListQuestionVO();
        vo.setId(po.getId());
        vo.setName(po.getName());
        vo.setDescription(po.getDescription());
        return vo;
    }
    
    @Override
    public List<ListQuestionVO> poList2VoList(List<ArticulationStorePO> poList) {
        if (poList == null) {
            return null;
        }
​
        List<ListQuestionVO> list = new ArrayList<>();
        for (ArticulationStorePO po : poList) {
            list.add(po2Vo(po));
        }
        return list;
    }
}

3. 使用 MapStruct 进行对象转换

在你的代码中,可以这样使用:

public class Main {
    public static void main(String[] args) {
        ArticulationStorePO po = new ArticulationStorePO();
        po.setId(1);
        po.setName("测试名称");
        po.setDescription("测试描述");
​
        // 自动转换
        ListQuestionVO vo = ArticulationStoreConvert.INSTANCE.po2Vo(po);
        System.out.println(vo);
    }
}

对于列表:

List<ArticulationStorePO> poList = Arrays.asList(po1, po2, po3);
List<ListQuestionVO> voList = ArticulationStoreConvert.INSTANCE.poList2VoList(poList);

4. MapStruct 依赖

如果你还没引入 MapStruct,需要在 pom.xml 里加上:

<dependencies>
    <!-- MapStruct 核心库 -->
    <dependency>
        <groupId>org.mapstruct</groupId>
        <artifactId>mapstruct</artifactId>
        <version>1.5.5.Final</version>
    </dependency>
​
    <!-- MapStruct 编译器插件 -->
    <dependency>
        <groupId>org.mapstruct</groupId>
        <artifactId>mapstruct-processor</artifactId>
        <version>1.5.5.Final</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

5. 进阶用法

(1)字段名不同的转换

如果 povo 字段名称不同,可以用 @Mapping 注解:

@Mapper
public interface ArticulationStoreConvert {
​
    @Mappings({
        @Mapping(source = "poId", target = "id"),
        @Mapping(source = "storeName", target = "name")
    })
    ListQuestionVO po2Vo(ArticulationStorePO po);
}

这样 poIdidstoreNamename,MapStruct 会自动映射。

(2)默认值 & 自定义转换

@Mapper
public interface ArticulationStoreConvert {
    @Mapping(source = "age", target = "age", defaultValue = "18")
    @Mapping(source = "gender", target = "sex", expression = "java(po.getGender().equals(\"male\") ? 'M' : 'F')")
    ListQuestionVO po2Vo(ArticulationStorePO po);
}

这里:

  • age 没有值时默认 18

  • gender"male" 则转换成 'M',否则 'F'


6. 总结

方式

特点

优缺点

手写转换方法

代码可控,手动写 BeanUtils.copyProperties()

代码冗余

MapStruct

编译期生成代码,性能高

需要编译

Dozer、ModelMapper

运行时反射映射

性能略低

MapStruct 适合 大多数企业级开发,自动生成转换代码,减少手写代码的麻烦!🚀


评论