1. MapStruct 是什么?
MapStruct 是一个 Java 对象映射框架,可以自动生成类型转换代码,避免手写 BeanUtils.copyProperties(),提升开发效率和代码可读性。
你的代码是如何转换的?
@Mapper注解告诉 MapStruct 这是一个转换接口。INSTANCE = Mappers.getMapper(ArticulationStoreConvert.class);
MapStruct 自动实现接口,并创建
INSTANCE实例。你可以直接用
ArticulationStoreConvert.INSTANCE.po2Vo(po);来转换。
定义了两个转换方法:
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)字段名不同的转换
如果 po 和 vo 字段名称不同,可以用 @Mapping 注解:
@Mapper
public interface ArticulationStoreConvert {
@Mappings({
@Mapping(source = "poId", target = "id"),
@Mapping(source = "storeName", target = "name")
})
ListQuestionVO po2Vo(ArticulationStorePO po);
}这样 poId → id,storeName → name,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没有值时默认18gender是"male"则转换成'M',否则'F'
6. 总结
MapStruct 适合 大多数企业级开发,自动生成转换代码,减少手写代码的麻烦!🚀