在我们日常开发的程序中,为了各层之间解耦,一般会定义不同的对象用来在不同层之间传递数据,比如xxxDTO、xxxVO、xxxQO,当在不同层之间传输数据时,不可避免地经常需要将这些对象进行相互转换。,今天给大家介绍一个对象转换工具MapStruct,代码简洁安全、性能高,强烈推荐。,MapStruct是一个代码生成器,它基于约定优于配置,极大地简化了Java Bean类型之间映射的实现。特点如下:,1. 引入依赖,这里使用Gradle构建;,2. 需要转换的对象,创建两个示例对象(e.g. 将Demo对象转换为DemoDto对象);,3. 创建转换器,只需要创建一个转换器接口类,并在类上添加 @Mapper 注解即可(官方示例推荐以 xxxMapper 格式命名转换器名称);,4. 验证,测试结果如下:,目标对象demoDto为:DemoDto(id=111, name=hello);,达到了我们的预期结果。,为什么声明一个接口就可以转换对象呢?我们看一下MapStruct在编译期间自动生成的实现类:,可以看到,MapStruct帮我们将繁杂的代码自动生成了,而且实现类中用的都是最基本的get、set方法,易于阅读理解,转换速度非常快。,上面的例子只是小试牛刀,下面开始展示MapStruct的强大之处。,(限于篇幅,这里不展示自动生成的实现类和验证结果,大家可自行测试)。,场景1:属性名称不同、(基本)类型不同,关键字:@Mapping注解。,场景2:统一映射不同类型,下面例子中,time1、time2、time3都会被转换,具体说明看下面的注释:,场景3:固定值、忽略某个属性、时间转字符串格式,一个例子演示三种用法,具体说明看注释,很容易理解:,关键字:ignore、constant、dateFormat,场景4:为某个属性指定转换方法,场景2中,我们是按照某个转换方法,统一将一种类型转换为另外一种类型;而下面这个例子,是为某个属性指定方法:,关键字:@Named注解、qualifiedByName,场景5:多个参数合并为一个对象,如果参数为多个的话,@Mapping注解中的source就要指定是哪个参数了,用点分隔:,关键字:点(.),场景6:已有目标对象,将源对象属性覆盖到目标对象,覆盖目标对象属性时,一般null值不覆盖,所以需要在类上的@Mapper注解中添加属性:nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE 代表null值不进行赋值。,关键字:@MappingTarget注解、nullValuePropertyMappingStrategy,场景7:源对象两个属性合并为一个属性,这种情况可以使用@AfterMapping注解。,关键字:@AfterMapping注解、@MappingTarget注解,本文介绍了对象转换工具 MapStruct 库,以安全、简洁、优雅的方式来优化我们的转换代码。,从文中的示例场景中可以看出,MapStruct 提供了大量的功能和配置,使我们可以快捷的创建出各种或简单或复杂的映射器。
© 版权声明
文章版权归作者所有,未经允许请勿转载。