文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

MapStruct到底是什么?

2024-04-02 19:55

关注

一、简介

现在的分布式系统中模块划分越来越细,不同模块的实体、DTO、DO等需要进行转换,这么多工程处理起来不是那么简单。

MapStruct 就是这样的一个属性映射插件,用于为Java Bean生成类型安全且高性能的映射。它基于编译阶段生成get/set代码,此实现过程中没有反射,不会造成额外的性能损失。只需要定义一个 Mapper 接口,MapStruct 就会自动实现这个映射接口,避免了繁琐的映射实现。

🍭 官网 - 🍤 官方示例

优点

与手工编写映射代码相比

与动态映射框架相比

二、Demo

2.1 导入依赖

使用该插件主要需要导入两个包:

::: details Maven | Gradle

Maven


<dependency>
        <groupId>org.mapstruct</groupId>
        <!-- jdk8以下就使用mapstruct -->
        <artifactId>mapstruct-jdk8</artifactId>
        <version>1.3.0.Final</version>
    </dependency>
				<!-- 注解处理器 -->
    <dependency>
        <groupId>org.mapstruct</groupId>
        <artifactId>mapstruct-processor</artifactId>
        <version>1.3.0.Final</version>
    </dependency>

Gradle


plugins {
    ...
    id "com.diffplug.eclipse.apt" version "3.26.0" // Only for Eclipse
}

dependencies {
    ...
    compile 'org.mapstruct:mapstruct:1.4.2.Final'

    annotationProcessor 'org.mapstruct:mapstruct-processor:1.4.2.Final'
    testAnnotationProcessor 'org.mapstruct:mapstruct-processor:1.4.2.Final' // if you are using mapstruct in test code
}
...

2.2 示例代码

::: details domain、vo、mapper、controller

domain/Person.java


@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Person {

    private Long id;

    private String name;

    private Integer age;

    private Integer sex;

}

vo/PersonVO.java


@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class PersonVO {
    private Long personId;
    private String personName;
    private Integer age;
}

mapper/PersonMapper.java


@Mapper(componentModel = "spring")
public interface PersonMapper {
    
    PersonMapper INSTANCE = Mappers.getMapper(PersonMapper.class);
    
    @Mappings({
            @Mapping(source = "id", target = "personId"),
            @Mapping(source = "name", target = "personName")
    })
    PersonVO toPersonVO(Person person);

    
    @Mappings({
            @Mapping(source = "personId", target = "id"),
            @Mapping(source = "personName", target = "name"),
      			@Mapping(target = "sex", ignore = true),
    })
    Person toPerson(PersonVO person);

}

Controller


@RestController
@RequestMapping("/api")
public class TestMapStructController {

    @Autowired
    PersonMapper personMapper;

    @GetMapping("convert")
    public List<Object> convertEntity() {
        ArrayList<Object> objectList = new ArrayList<>();
        Person person = Person.builder()
                .id(5L)
                .name("zhangsan")
                .age(12)
                .sex(1)
                .build();
        objectList.add(person);

        PersonVO personVO = personMapper.toPersonVO(person);
        Person person1 = personMapper.toPerson(personVO);
        objectList.add("person 转 personVO" + personVO);
        objectList.add("personVO 转 person" + person1);
        return objectList;
    }
}

打包后会看见 mapstruct 为我们生成了 mapper 的实现类

image-20210609160633395 

三、 注解介绍

@Mapper :MapStruct 注解处理器会扫描这个注解

先介绍一下 @Mapper 注解的 componentModel 属性,该属性用于自动生成的接口实现类的组件类型,这个属性支持四个值:

1.default : 这是默认的情况,mapstruct 不使用任何组件类型, 可以通过Mappers.getMapper(Class)方式获取自动生成的实例对象。

2.cdi : 生成的映射器是一个应用程序范围的 CDI bean,可以通过 @Inject 检索

3.spring : 生成的实现类上面会自动添加一个@Component注解,可以通过Spring的 @Autowired方式进行注入

4.jsr330 : 生成的实现类上会添加@javax.inject.Named 和@Singleton注解,可以通过 @Inject注解获取

@Mappings:配置多个@Mapping

@Mapping 属性映射,若源对象属性与目标对象名字一致,会自动映射对应属性

1.source :参数类的属性

2.target :要转换的类的属性

3.ignore :配合 target 使用,表示改转换类的的属性不需要映射

4.expression :配合 target 使用,表示改转换类的的属性使用指定的表达式进行转换


@Mapping(
         target = "someProp",
         expression = "java(new TimeAndFormat( s.getTime(), s.getFormat() ))"
)

5.expression :配合 target 使用,表示改转换类的的属性使用指定的表达式进行转换


@Mapping(
         target = "someProp",
         expression = "java(new TimeAndFormat( s.getTime(), s.getFormat() ))"
)

其他请参考源文件或官网,后续用到再补充

到此这篇关于MapStruct到底是什么?的文章就介绍到这了,更多相关MapStruct的使用内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     801人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     348人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     311人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     432人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     220人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯