MapStruct的一些常规用法

这篇具有很好参考价值的文章主要介绍了MapStruct的一些常规用法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

每天坚持写一篇原创文章。

使用过MapStruct之后,再也没用过BeanCopy来复制对象了。确实是非常好用的工具库。
MapStruct的一些常规用法
MapStruct是一个代码生成器,简化了不同的Java Bean之间映射的处理,所以映射指的就是从一个实体变化成一个实体。例如我们在实际开发中,DAO层的实体和一些数据传输对象(DTO),大部分属性都是相同的,只有少部分的不同,通过mapStruct,可以让不同实体之间的转换变的简单。我们只需要按照约定的方式进行配置即可。

大家的命名都不一样,我个人是习惯把数据库的DO对象叫Entity实体。
返回前端的叫VO。

把Entity复制到VO并做一些操作或者转换,再返回前端,都会用到。

安装

1、引用
唯一需要注意的就是如果配合Lombok,需要在编译源码的插件上做好配置。

<properties>
        <mapstruct.version>1.3.0.Final</mapstruct.version>
</properties>

<!-- MapStruct核心,包含了一些必要的注解-->
<dependencies>
    <dependency>
        <groupId>org.mapstruct</groupId>
        <artifactId>mapstruct</artifactId>
        <version>${mapstruct.version}</version>
    </dependency>
</dependencies>
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>${maven.compiler-plugin.version}</version>
            <configuration>
                <source>${java.version}</source>
                <target>${java.version}</target>
                <compilerVersion>${java.version}</compilerVersion>
                <fork>true</fork>
                <encoding>${project.build.sourceEncoding}</encoding>
                <verbose>true</verbose>
                <annotationProcessorPaths>
                    <!-- 同时用Lombok,需要将Lombok放前面 -->
                    <path>
                        <groupId>org.projectlombok</groupId>
                        <artifactId>lombok</artifactId>
                        <version>${lombok.version}</version>
                    </path>
                    <!-- MapStruct编译,注解处理器,根据注解自动生成Mapper的实现 -->
                    <path>
                        <groupId>org.mapstruct</groupId>
                        <artifactId>mapstruct-processor</artifactId>
                        <version>${mapstruct.version}</version>
                    </path>
                </annotationProcessorPaths>
            </configuration>
        </plugin>
    </plugins>
</build>

2、定义转换接口

@Mapper
public interface OrderConvertor {

    OrderConvertor INSTANCE = Mappers.getMapper(OrderConvertor.class);
 
    @Mapping(source = "student.birthday", target = "birthday", dateFormat = "yyyy-MM-dd HH:mm:ss") // 指定时间格式
    @Mapping(target = "name", source = "student.name", defaultValue = "张三") //默认值
    OrderVo toVo(OrderEntity order);
}

target表示目标属性名,source表示源属性名,一般在目标属性和源属性不同时使用,相同的属性名会自动进行映射。
MapStruct会自动生成对应接口的实现,并自动完成属性映射关系,List会自动进行批量处理。

3、使用时

@Service
public class OrderService {
    public List<OrderVo> getOrderList() {
        // 获取数据库数据
        List<OrderEntity> result = selectOrderList();
        // 参数转换
        return OrderConvertor.INSTANCE.toVo(result);
    }
}

下面是我常用的一些功能记录

1、添加为Spring的Component组件

@Mapper(componentModel = "spring")

2、List转换为String
类注解加上引用

@Mapper(imports = {Collectors.class, TelegramGroupEntity.class})

代码里面:使用表达式,转换为字符串

@Mapping(target = "groupStr", expression = "java(source.getBindGroups()!= null? source.getBindGroups().stream().map(TelegramGroupEntity::getName).collect(Collectors.joining(\", \")) : null)")
AcceptanceBankVo convert(AcceptanceBankEntity source);

直接转换List为换行的String

@Mapping(target = "groupStr", expression = "java(source.getBindGroups()!= null? source.getBindGroups().stream().map(TelegramGroupEntity::getName).collect(Collectors.joining(\"\\n\")) : null)")

直接调用方法

@Mapper(imports = {Collectors.class, TelegramGroupEntity.class, IndiaDateUtil.class})
public interface TransferBankConvert {
TransferBankConvert INSTANCE = Mappers.getMapper(TransferBankConvert.class);

@Mapping(target = "timeAgo", expression = "java(source.getLastActiveTime()!= null? IndiaDateUtil.getTimeAgo(source.getLastActiveTime(),\"Asia/Kolkata\") : null)")
TransferBankVo convert(TransferBankEntity source);
}

3、获取时间

@Mapping(target = "recordTime",expression = "java(new java.util.Date())")

4、空检查

@Mapper(nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS)

5、枚举映射String和string到枚举
int转枚举的value

@Mapper(imports = {AccptanceRoleTypeEnum.class}) // 加到类上引用进来

@Mapping(target = "roleText", expression = "java(AccptanceRoleTypeEnum.getItemValue(source.getRole()))")

枚举上加上:

/**
 * 根据Value取描述
 * @param value
 * @return
 */
public static String getItemValue(Integer value) {
    AccptanceRoleTypeEnum match = Stream.of(values()).filter(item -> item.value.equals(value)).findAny().orElse(null);
    return match == null ? null : match.getDesc();
}

6、Fill同对象填充新对象,把source填充到target里面,和以前的beancopy一样的。

@BeanMapping(nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE,
        nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS)
@Mappings({
        @Mapping(target = "id", ignore = true),
        @Mapping(target = "createTime", ignore = true),
        @Mapping(target = "updateTime", ignore = true)
})
void fill(TelegramGroupRoleEntity source, @MappingTarget TelegramGroupRoleEntity target);

要忽略空值填充

@BeanMapping(nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE)
void update(DTO dto, @MappingTarget Bean bean);

7、Map提取,还是用表达式最简单

@Mappings({
        @Mapping(expression = "java(mapConfig.getOrDefault(\"INPAY_RATES\",""))", target = "inpayRates"),
        @Mapping(expression = "java(mapConfig.getOrDefault(\"AUTO_CREDIT\",""))", target = "autoCredit")
})
TelegramGroupWithConfigVo convert(TelegramGroupEntity entity);

8、空值判断

@Mapping(target = "targetField", expression = "java( sourceField == null || sourceField.isEmpty() ? null : sourceField )") 来将空字符串映射为 null

更多内容请关注我的公众号:青塬科技。文章来源地址https://www.toymoban.com/news/detail-837881.html

到了这里,关于MapStruct的一些常规用法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 关于Ping命令的七种常规用法(详解)

    一、 ping 基本使用详解 在网络中 ping 是一个十分强大的 TCP/IP 工具。它的作用主要为: 1 、用来检测网络的连通情况和分析网络速度 2 、根据域名得到服务器 IP 3 、根据 ping 返回的 TTL 值来判断对方所使用的操作系统及数据包经过路由器数量。 我们通常会用它来直接 ping ip 地

    2024年04月11日
    浏览(68)
  • 针对于selenium的一些常规配置(防检测,无头,保留自己浏览器的登录信息等)

    在使用selenium的时候有时候会受到网站的检测导致我们的程序被迫中止,因此我们需要给selenium添加一些浏览器特征来防止被网站检测到**(1-4为防检测配置)**. 在给selenium添加参数的时候,我们可以使用add_argument selenium添加user-agent参数 去除 “Chrome正受到自动化测试软件的控制”

    2024年02月12日
    浏览(49)
  • PYTHON用法第一篇:print的用法。

    hello大家好,我是会编程的杜子腾,今天我们来学习一下python实例:print用法。 使用材料: 一台电脑 python各版本(随便一个,尽量选python3) python文本编辑器:IDLE,PYCHARM...... 1.用print打印字符串: 我们先用print加上一对小括号,如下方所示: 接下来再在里面写上引号,如下方所示

    2024年02月07日
    浏览(47)
  • rabbitmq基础3——环境变量、配置文件、参数策略Parameter和Policy的常规用法、Federation插件、联邦交换器

    从前面的操作来看,我们并没有用到配置相关的东西,比如修改配置文件?比如运行时指定某某参数? 其实,大多数情况下我们默认启动rabbitmq服务时就是用的默认参数,并且也够用了。但是对于一名合格的运维来说,需要全面掌握每一个细节,才能更加高效的操作rabbitmq。

    2024年02月16日
    浏览(45)
  • ElasticSearch常见用法,看这一篇就够了

    2024送书福利正式起航 关注「哪吒编程」,提升Java技能 文末送3本《一本书讲透Elasticsearch:原理、进阶与工程实践》 大家好,我是哪吒。 ElasticSearch是一款由Java开发的开源搜索引擎,它以其出色的实时搜索、稳定可靠、快速安装和方便使用的特性,在Java开发社区中赢得了广

    2024年03月19日
    浏览(70)
  • 【Mysql】一篇学会SQL中的递归的用法

             SQL递归查询是一种用于处理具有层次结构的数据的技术。它使用递归函数来遍历树形结构,例如组织结构、分类结构等等。         递归查询通常使用 \\\" WITH RECURSIVE \\\"  语句实现。         WITH RECURSIVE 语句包含两部分:             a.递归部分: 定义了如

    2024年02月13日
    浏览(97)
  • Elastic Search一些用法

    参考: 中国开源社区 官方介绍 ES 的权重排序 【Elasticsearch】ElasticSearch 7.8 多字段权重排序 ElasticSearch7.3学习(十三)----定制动态映射(dynamic mapping) 【Elasticsearch教程4】Mapping 动态映射 【Elasticsearch教程5】Mapping 动态模板 Dynamic templates 注意事项:需要先创建模板,然后添加数据

    2024年02月06日
    浏览(46)
  • 【EasyExcel】的一些用法

    一、AnalysisEventListener监听类,可以用来解析Excel 用来进行监听,一方面,它可以处理空数据的检查,重复数据的检查等一些数据筛查工作。另一方面,也可以做数据的存储,如果在此做数据存储,那么数据的转换也是可以在这里完成的。 在该监听器中,通过重写AnalysisEventL

    2024年02月10日
    浏览(34)
  • [opencv]中一些函数的用法

    1. cv2.bitwise_and() cv2.bitwise_and() 是 OpenCV 中的位运算函数之一,用于对两幅二值图像进行按位“与”操作。具体来说,对于每个像素,将两幅输入图像相应位置的像素值分别进行按位“与”运算,输出的结果图像的对应像素值即为这两幅输入图像对应像素值的按位与结果。 cv2

    2024年02月06日
    浏览(52)
  • nmap 网络扫描工具用法。以下是 nmap 常用的一些用法:

    扫描单个主机或 IP 地址: nmap [options] target 例如:nmap 192.168.0.1 扫描多个主机或 IP 地址: nmap [options] target1 target2 ... 例如:nmap 192.168.0.1 192.168.0.2 扫描整个网段: nmap [options] IP/mask 例如:nmap 192.168.0.0/24 扫描多个端口: nmap [options] -p port1,port2,... target 例如:nmap -p 80,443,8080 192

    2024年02月13日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包