MapStruct文档(一)——简介

mapstruct是一个java的bena对象转换映射工具。只需定义mapper接口,会在编译时动态的生成进行set/get操作的class实现类文件,在运行时直接调用。速度快,其他性能指标也很好。
 

需要配置的mavne设置


...
<dependencies>
    <dependency>
        <groupId>org.mapstruct</groupId>
        <artifactId>mapstruct</artifactId>
        <version>1.4.1.Final</version>
    </dependency>
</dependencies>
...
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.1</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
				<!--   使用lombok注意冲突,maven-compiler-plugin要3.6以上,lombok使用1.16.16版本以上,需要配置lombok的path   -->
                <annotationProcessorPaths>
                    <path>
                        <groupId>org.mapstruct</groupId>
                        <artifactId>mapstruct-processor</artifactId>
                        <version>1.4.1.Final</version>
                    </path>
					<!-- 此配置的意思 详见第10章 -->
					<path>
    					<groupId>com.haru.acfun</groupId>
    					<artifactId>spi</artifactId>
    					<version>1.0-SNAPSHOT</version>
					</path>
					<path>
					    <groupId>org.projectlombok</groupId>
					    <artifactId>lombok</artifactId>
					    <version>1.18.8</version>
					</path>
                </annotationProcessorPaths>
            </configuration>
        </plugin>
    </plugins>
</build>
...

定义之后会使用到的类


@Data
@ToString
public class TestPO {

    private Long id;

    private String name;

    private BigDecimal price;

    private Date creteTime; 

}
 
@Data
@ToString
public class TestTwoPO {

    private Long id;

    private String title;
 
	private Float totalPrice;
}

@Data
@ToString
public class TestBO {

    private Long id;

    private String name;

    private BigDecimal price;

    private Date creteTime;

}
 
@Data
@ToString
public class TestMixBO {

    private Long id;

    private String name;

    private BigDecimal price;

    private Date creteTime;

    private String title;
}
 
@Data
@ToString
public class TestThreePO {

    private TestPO test;
}
 
@Data
@ToString
public class TestThreePO {

    private TestPO test;

    private BigDecimal totalPrice;
}
 
@Data
public class TestFourBO {

    private TestFiveBO test;

    private String totalPrice;
}
 
@Data
@ToString
public class TestFiveBO {

    private Long idFive;

    private String name;

    private String price;

    private String title;

    private Date creteTime;

}
 
@Data
@ToString
public class BaseBO {

    private Long id;
 
	private String name;
}
 
@EqualsAndHashCode(callSuper = true)
@Data
@ToString(callSuper = true)
public class TestSixBO extends BaseBO {

}
 
@Data
@ToString
public class TestSevenBO {

    private TestSixBO test;

}
 
@Data
@ToString
public class BasePO {

    private Long id;
}
 
@EqualsAndHashCode(callSuper = true)
@Data
@ToString
public class TestFourPO extends BasePO {
}
 
@Data
public class TestFivePO {

    private TestFourPO test;
}

简单使用

@Mapper // 添加注解
public interface TestMapper {

    TestBO testToBO(TestPO testPO);

    TestPO testToP0(TestBO testBO);

    List<TestBO> testToBOS(List<TestPO> testPOS);

    List<TestPO> testToP0S(List<TestBO> testBOS);
}
 
@Test
public void baseTest() {
    List<TestPO> list = new ArrayList<>();
    for (int i = 0; i < 1000; i++) {
        TestPO testPO = new TestPO();
        testPO.setId(1L);
        testPO.setName("haru");
        testPO.setPrice(new BigDecimal("12.02"));
        testPO.setCreteTime(new Date(System.currentTimeMillis()));
        list.add(testPO);
    }

    TestMapper mapper = Mappers.getMapper(TestMapper.class);  // 获取mapper
    List<TestBO> testBOS = mapper.testToBOS(list); // 转换
    System.out.println(testBOS);
}

编译后自动生成的实现类


import com.ljc.dozer.bo.TestBO;
import com.ljc.dozer.po.TestPO;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Generated;

@Generated(
    value = "org.mapstruct.ap.MappingProcessor",
    date = "2020-10-28T14:06:53+0800",
    comments = "version: 1.4.1.Final, compiler: javac, environment: Java 1.8.0_251 (Oracle Corporation)"
)
public class TestMapperImpl implements TestMapper {

    @Override
    public TestBO testToBO(TestPO testPO) {
        if ( testPO == null ) {
            return null;
        }

        TestBO testBO = new TestBO();

        testBO.setId( testPO.getId() );
        testBO.setName( testPO.getName() );
        testBO.setPrice( testPO.getPrice() );
        testBO.setCreteTime( testPO.getCreteTime() );

        return testBO;
    }

    @Override
    public TestPO testToP0(TestBO testBO) {
        if ( testBO == null ) {
            return null;
        }

        TestPO testPO = new TestPO();

        testPO.setId( testBO.getId() );
        testPO.setName( testBO.getName() );
        testPO.setPrice( testBO.getPrice() );
        testPO.setCreteTime( testBO.getCreteTime() );

        return testPO;
    }

    @Override
    public List<TestBO> testToBOS(List<TestPO> testPOS) {
        if ( testPOS == null ) {
            return null;
        }

        List<TestBO> list = new ArrayList<TestBO>( testPOS.size() );
        for ( TestPO testPO : testPOS ) {
            list.add( testToBO( testPO ) );
        }

        return list;
    }

    @Override
    public List<TestPO> testToP0S(List<TestBO> testBOS) {
        if ( testBOS == null ) {
            return null;
        }

        List<TestPO> list = new ArrayList<TestPO>( testBOS.size() );
        for ( TestBO testBO : testBOS ) {
            list.add( testToP0( testBO ) );
        }

        return list;
    }
}

结果

@Mapper:若映射的对象字段名相同,只需在要映射的接口上添加此注解就可以了;@Mapping用于指定映射的字段,可以设置映射的字段名等,后续会说明。

若是运行项目后没有自动生成实现类,请手动执行mvn clean compile

 

MapStruct文档(二)——映射

MapStruct文档(三)——Spring注入

MapStruct文档(四)——转换

MapStruct文档(五)——集合映射

MapStruct文档(六)——枚举映射

MapStruct文档(七)——对象工厂

MapStruct文档(八)——高级映射选项

MapStruct文档(九)——高级映射选项

MapStruct文档(十)——映射扩展

MapStruct文档(十一)——SPI

MapStruct文档(十二)——protobuf映射

MapStruct文档(十三)——问题分析

 

mapstruct文档

mapstruct常见问题

mapstruct官方DEMO

注:下文中的 *** 代表文件名中的组件名称。 # 包含: 中文-英文对照文档:【***-javadoc-API文档-中文(简体)-英语-对照版.zip】 jar包下载地址:【***.jar下载地址(官方地址+国内镜像地址).txt】 Maven依赖:【***.jar Maven依赖信息(可用于项目pom.xml).txt】 Gradle依赖:【***.jar Gradle依赖信息(可用于项目build.gradle).txt】 源代码下载地址:【***-sources.jar下载地址(官方地址+国内镜像地址).txt】 # 本文件关键字: 中文-英文对照文档,中英对照文档,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压 【***.jar中文文档.zip】,再解压其中的 【***-javadoc-API文档-中文(简体)版.zip】,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·本文档为双语同时展示,一行原文、一行译文,可逐行对照,避免了原文/译文来回切换的麻烦; ·有原文可参照,不再担心翻译偏差误导; ·边学技术、边学英语。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值