• MapStruct的一些常规用法


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

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

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

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

    安装

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

    <properties>
            <mapstruct.version>1.3.0.Finalmapstruct.version>
    properties>
    
    
    <dependencies>
        <dependency>
            <groupId>org.mapstructgroupId>
            <artifactId>mapstructartifactId>
            <version>${mapstruct.version}version>
        dependency>
    dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.pluginsgroupId>
                <artifactId>maven-compiler-pluginartifactId>
                <version>${maven.compiler-plugin.version}version>
                <configuration>
                    <source>${java.version}source>
                    <target>${java.version}target>
                    <compilerVersion>${java.version}compilerVersion>
                    <fork>truefork>
                    <encoding>${project.build.sourceEncoding}encoding>
                    <verbose>trueverbose>
                    <annotationProcessorPaths>
                        
                        <path>
                            <groupId>org.projectlombokgroupId>
                            <artifactId>lombokartifactId>
                            <version>${lombok.version}version>
                        path>
                        
                        <path>
                            <groupId>org.mapstructgroupId>
                            <artifactId>mapstruct-processorartifactId>
                            <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
    

    更多内容请关注我的公众号:青塬科技。

  • 相关阅读:
    JVM GC垃圾回收
    微服务架构--介绍
    MySQL对日期计算
    2022-02-02-Vue和Element
    【一起学Rust | 基础篇】rust函数与流程控制详解
    JAVA转GO
    【C++】构造函数初始化列表的特性以及注意事项
    广西建筑工地模板:支模九层桉木模板
    为什么感觉越来越穷
    [附源码]计算机毕业设计JAVA游戏战队考核系统
  • 原文地址:https://www.cnblogs.com/kylexy/p/18055007