MapStruct 对象间属性复制
发布日期:2025-04-12 00:20:43 浏览次数:8 分类:精选文章

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

在Java项目开发过程中,对象间属性值的拷贝是一个常见需求。虽然Spring和Apache BeatUtils等框架提供了反射机制来实现属性拷贝,但MapStruct提供了一种更简洁高效的解决方案。MapStruct通过代码生成的方式,自动处理对象间属性的映射关系。

以下将从基础用法到高级功能,详细介绍MapStruct的实现步骤。

1. 引入依赖

首先需要在项目的POM文件中引入MapStruct相关依赖:

maven.compiler.source=8maven.compiler.target=8mapstruct.version=1.3.1.Final
org.mapstruct
mapstruct
${mapstruct.version}
org.mapstruct
mapstruct-jdk8
${mapstruct.version}
org.mapstruct
mapstruct-processor
${mapstruct.version}

2. 创建POJO

新建两个POJO类,分别表示数据来源和目标对象:

package com.xx.mapstruct;import lombok.Data;@Datapublic class Src {    private String name;}
package com.xx.mapstruct;import lombok.Data;@Datapublic class Target {    private String name;}

3. 定义转换接口

创建一个转换接口DemoMap,并利用MapStruct的注解定义映射关系:

package com.xx.mapstruct;import org.mapstruct.Mapper;import org.mapstruct.factory.Mappers;@Mapperpublic interface DemoMap {    DemoMap CAR_MAP = Mappers.getMapper(DemoMap.class);        Target tar(Src src);}

4. 定义映射方法

在转换接口中添加映射注解,指定属性转换关系:

package com.xx.mapstruct;import org.mapstruct.Mapper;import org.mapstruct.Mapping;import org.mapstruct.factory.Mappers;@Mapperpublic interface DemoMap {    DemoMap CAR_MAP = Mappers.getMapper(DemoMap.class);        Target tar(Src src);        @Mapping(source = "name", target = "name2")    Target2 tar2(Src src);}

5. 测试类

编写测试类,验证转换功能:

package com.xx;import com.xx.mapstruct.DemoMap;import com.xx.mapstruct.Src;import com.xx.mapstruct.Target;import org.junit.Test;public class MapStructTest {    @Test    public void test01() {        Src src = new Src();        src.setName("ppp");        Target tar = DemoMap.CAR_MAP.tar(src);        System.out.println(tar.getName());    }}

6. 指定源属性与目标属性

当目标对象的属性名与源对象不一致时,可以通过@Mapping注解手动指定映射关系:

package com.xx.mapstruct;import org.mapstruct.Mapper;import org.mapstruct.Mapping;import org.mapstruct.factory.Mappers;@Mapperpublic interface DemoMap {    DemoMap CAR_MAP = Mappers.getMapper(DemoMap.class);        Target tar(Src src);        @Mapping(source = "name", target = "name2")    Target2 tar2(Src src);}

7. 测试类

编写测试类验证具体映射关系:

@Testpublic void test02() {    Src src = new Src();    src.setName("ppp02");    Target2 tar = DemoMap.CAR_MAP.tar2(src);    System.out.println(tar.getName2());}

8. 实现原理

MapStruct通过Java AbstractProcessor在Javac编译期自动生成处理代码。默认情况下,MapStruct会根据POJO类自动匹配属性名进行映射。如果需要定制映射关系,可以通过注解手动指定。

上一篇:MapStruct 映射过程中忽略某个字段
下一篇:MapReduce:大数据处理的范式

发表评论

最新留言

做的很好,不错不错
[***.243.131.199]2025年04月29日 10时24分00秒