高效、优雅的对象Copy之MapStruct入门到精通,实战踩坑版

高效、优雅的对象Copy之MapStruct入门到精通,实战踩坑版,大家在开发中,最让人头疼的就是:对象之间的拷贝,前端的VO和数据库的Entity不一致!,性能最好的就是手动set,主要是枯燥且无技术含量,不仅耗费大量时间而且很容易出错;,所以我们要成为优秀的程序员,要多借助轮子,开发效率事半功倍,开发技能也是增长不少!,如果系统性能没有要求,怎么实现都是好的,但是我们要有追求哈,追求高质量!,每个东西都有存在的价值,不要捧一踩一哈!,MapStruct是基于JSR 269的Java注释处理器,用于生成类型安全的 Bean 映射类。,您所要做的就是定义一个映射器接口,该接口声明任何所需的映射方法。在编译过程中,MapStruct将生成此接口的实现。此实现使用纯 Java 方法调用在源对象和目标对象之间进行映射,即无反射或类似内容。,与手动编写映射代码相比,MapStruct通过生成繁琐且容易出错的代码来节省时间。遵循配置方法的约定,MapStruct使用合理的默认值,但在配置或实现特殊行为时会步入歧途。,图片,与动态映射框架相比,MapStruct具有以下优点:,性能图大家可以看一下:,图片,@Mapper将接口标记为映射接口对于源对象和目标对象中具有不同名称的属性,可以使用注释来配置名称:@Mapping按照约定,接口声明一个成员Mappers INSTANCE,为客户端提供对映射器实现的访问。下面我们来具体使用!,这里使用最新的,如果引入了lombok可能会有问题,就是他们俩都是在编译期运行的,mapstruct如果比lombok先执行,就会找不到get、set方法,所以会有问题,官网已经有了解决方案!现在是启动不会报错!,我们需要加上依赖:,官网解决文章地址:https://mapstruct.org/faq/#Can-I-use-MapStruct-together-with-Project-Lombok。,用户表:,前端用户VO:,我们创建接口进行两个对象之间的映射:,属性多了可以嵌套:,也可以:,编写测试类:,图片,我们看到拷贝没有任何问题!,我们看看是怎么实现的:,mapstruct会在编译期自动生成实现类去帮助我们去赋值,不指定默认策略,名称一致进行copy!不一致可以按上面的进行指定,不指定则不会有set方法!,图片,下面进行多个源参数的映射方法演示:,我们把user类加上一个字段:,新增加一个Score类:,调整上面的UserMapper接口:,测试代码:,结果显示正常:,图片,我们在来看一个企业级能够用得上的,就是自定义方法,然后进行赋值:,场景:一个商品有长宽高,我们把长宽高从cm变为m!,还有很多String转Integer、Float等等,都是按照下面这种自定义方法去实现!,VO和对象都是一样的哈!,看清楚,别导错包了!
qualifiedByName:指定自定义方法的名称。,@Named(“cmToM”):起别名,不使用找不到方法。,可以写一起,也可以整一个工具类里写方法,在这里进行引用!如果是使用spring,我们可以把接口作为bean进行注入调用(推荐)加上参数即可开启:
​@Mapper(componentModel = MappingConstants.ComponentModel.SPRING),测试:,完美转化!,图片,在实战一个LocalDateTime、String相互转化的,后面大家可以去官网文档去找你需要的:,在刚刚的商品类加个字段:,VO里也加上一个:,编写个转化类:
这里交给spring管理了,因为ProductMapper也交给spring管理,不加的话会找不到此类!,ProductMapper修改一下:,uses = LocalDateTimeMapper.class使用咱们上面写的类即可!,测试一下:,完美转化:,图片

文章版权声明

 1 原创文章作者:cmcc,如若转载,请注明出处: https://www.52hwl.com/19429.html

 2 温馨提示:软件侵权请联系469472785#qq.com(三天内删除相关链接)资源失效请留言反馈

 3 下载提示:如遇蓝奏云无法访问,请修改lanzous(把s修改成x)

 免责声明:本站为个人博客,所有软件信息均来自网络 修改版软件,加群广告提示为修改者自留,非本站信息,注意鉴别

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023年3月5日 上午12:00
下一篇 2023年3月7日 下午10:34