MapStruct 的真香定律

前言

最近在做到项目中用到了 mapStruct,不用则以,一用发现真香。首先我们来认识下他到底是个什么?有哪些功能?为什么偏偏用这个插件?怎么用到实战中来?任何技术及语言一定要抱着这样的初衷去使用才能有所收获。让我带着这四个疑问进入今天的分享。

mapStruct是什么

MapStruct是基于JSR 269的Java注解处理器,因此可以在命令行构建中使用(javac、Ant、Maven等等),可以在IDE内使用。用于生成类型安全的bean映射类的Java注解处理器。属于编译时注解,如果转换bean内容有变化。需要手动clean下才能将变化的内容体现到class文件中。说白了就是通过注解的形式帮我们生成set,get方法。如图所示。

图1是我们创建的MapStruct 接口,一定是接口的形式声明
图片描述
图2 是程序编译时替我们生成的实现类,用来为我们转换参数的。其实就是set,get方法。
在这里插入图片描述

mapStruct有哪些功能

最大的功能就是为我们转换两个不同得bean,或者List,比如拿java的代码规范来说。客户端入参–>系统的业务层入参—>db数据库的入参;就对这3个层次来说。一个req绝对是不能透传到db层的。为什么呢?就是为了降低耦合。提高业务的单一性,那么某一层参数有改变不会影响其他层。

如和去使用整合到spring中

一、整合有两种方式:

接口注入静态方法调用,两种方法皆可,具体看公司规定,个人推崇接口注入。

  1. 接口注入方式
    mapStruct接口类的声明
@Mapper(componentModel = "spring")  -- 使用@Mapper(componentModel = "spring") 整合
public interface ItemInfoConvert {

}
------------------------------------------------------
调用:
@Autowired
 private ItemInfoConvert itemInfoConvert;
 Person person = itemInfoConvert.deliveryDO2DTO(cart);
 直接接口注入,方法调用即可
  1. 静态方法调用
    mapStruct接口类的声明
public interface ItemInfoConvert {
   //静态方法
    ItemInfoConvert INSTANCE = Mappers.getMapper(ItemInfoConvert.class);
}
---------------------------------------------
调用:
Person person= ItemInfoConvert.INSTANCE.deliveryDO2DTO(cart);

二、转换bean遇到的问题总结

1、保证相同的数据结构,即参数的类型相同,同string 或者同Integer,类型不同无法转换
2、避开关键字,比如:delete等
2、注解描述:

时间转换并格式化
@Mapping(source = “birthday”, target = “birthDateFormat”, dateFormat = “yyyy-MM-dd HH:mm:ss”),
@Mapping:属性映射,若源对象属性与目标对象名字一致,会自动映射对应属性
source:源属性
target:目标属性
dateFormat:String 到 Date 日期之间相互转换,通过 SimpleDateFormat,该值为 SimpleDateFormat的日期格式
ignore: 忽略这个字段
@Mappings:配置多个@Mapping
@MappingTarget 用于更新已有对象
@InheritConfiguration 用于继承配置

3、具体代码

@Mappings({
            //忽略 categoryId 的转换
            @Mapping(target = "categoryId",ignore = true),
            //源数据类中的集合应用 --> 目标类中的数据引用--转换List
            @Mapping(target = "trees",source = "colors"),
            //嵌套类的属性简单传递转换
            @Mapping(target = "run",source = "cart.animal.run"),
            //numberFormat的格式化Number类型 --> Number或String或者String或Number才有效;其余情况无效。
            //string -->Double :*.0(12.0);有效长度16位更精确。
            //string -->Float :单精度,有效长度8位,如果超出会胜率后面的数字;12.00033452或者12.00033456都会转成12.00033452
            @Mapping(target = "numberPerson", source = "cart.number", numberFormat = "0.00", defaultValue = "0"),
            //用到的机会很少不做说明
            @Mapping(target = "birthday", source = "birthDateFormat", dateFormat = "yyyy-MM-dd HH:mm:ss"),

    })
    Person deliveryDO2DTO(Cart cart);

如果在某个方法上不加@Mapping则是按相同名称转换的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值