Java中性能超越各个BeanUtils的Object对象属性映射框架MapStruct常规使用方式和技巧
创始人
2024-06-03 11:45:52
0

文章目录

  • 1. MapStruct使用方式
  • 2. 为什么选择MapStruct
  • 3. 使用说明
    • 3.1 对接Spring框架
    • 3.2 @Mapping的使用
      • 3.2.1 target和source
      • 3.2.2 dateFormat属性
      • 3.2.3 numberFormat属性
      • 3.2.4 constant属性
      • 3.2.5 expression属性
      • 3.2.6 ignore属性
    • 3.3 @Context的使用
      • 3.3.1 集合传递自定义参数
      • 3.3.2 函数式编程实现自定义功能

1. MapStruct使用方式

引入maven:

org.mapstructmapstruct1.4.2.Final
org.mapstructmapstruct-processor1.4.2.Final

使用mapstruct-jdk8编译可能会报java: Couldn't retrieve @Mapper annotation错误,替换成mapstruct即可。

MapStruct使用方式十分简单,创建一个interface类,并编写转换方法:

@Mapper
public interface TestMapStruct {TestMapStruct INSTANCE = Mappers.getMapper(TestMapStruct.class);ClassB aToB(ClassA a);
}

假设ClassAClassB的字段名称一模一样。使用时直接调用方法即可:

ClassB b = TestMapStruct.INSTANCE.aToB(a);

这样就能完成不同类相同字段的属性映射,十分简单。

IDEA推荐下载MapStruct Support插件,以方便看到MapStruct的注解提示。

2. 为什么选择MapStruct

TestMapStruct接口为例,MapStruct的底层原理是生成一个新类TestMapStructImpl实现TestMapStruct接口,并根据规则实现aToB方法,在aToB方法中自动根据两个类的字段名生成对应的settergetter方法,最终达到由我们自己编写settergetter方法一样的效果。因此从原理上而言,MapStruct调用时的性能和我们自己编写settergetter方法性能基本无任何差异,这是其它的BeanUtil实现方式无可比拟的。

换句话说,MapStruct的作用就是在编译时为我们自动生成对应的settergetter方法。这样的实现方式效率从本质上就已经超越了各个BeanUtil运行时根据反射动态赋值。

3. 使用说明

3.1 对接Spring框架

对接Spring框架官方提供了支持,只需要按以下配置即可:

@Mapper(componentModel = "spring")
public interface TestMapStruct {...
}public class Test {@Autowiredprivate TestMapStruct testMapStruct;
}

设置了componentModel="spring"后生成的实现类将会被@Component注解注释,并由Spring加载到容器中使用。

3.2 @Mapping的使用

如果需要复制属性的两个类存在部分字段名称或类型不一致时,可使用@Mapping注解来进行手动的映射。

3.2.1 target和source

赋值属性,target为目标字段,source为来源字段,target一定不能为空。名称不一致时可指定target和source名称,如:

public class ClassA {private String a;
}public class ClassB {private String b;
}@Mapper(componentModel = "spring")
public interface TestMapStruct {@Mapping(target = "b", source = "a");ClassB aToB(ClassA classA);
}

3.2.2 dateFormat属性

支持将Date属性以日期格式转成String

返回给前端的Vo类有createTime属性,为String类型,但数据库实体类型为Date,此时可以使用该属性将Date自动以某种格式转成String,如:

public class ClassA {private Date a;
}public class ClassB {private String b;
}@Mapper(componentModel = "spring")
public interface TestMapStruct {@Mapping(target = "b", source = "a", dateFormat = "yyyy");ClassB aToB(ClassA classA);
}

dateFormat使用SimpleDateFormat实现。

3.2.3 numberFormat属性

支持使用DecimalFormat方式将数字转换成String。如:

public class ClassA {private double a;
}public class ClassB {private String b;
}@Mapper(componentModel = "spring")
public interface TestMapStruct {@Mapping(target = "b", source = "a", numberFormat = "#.##元");ClassB aToB(ClassA classA);
}

3.2.4 constant属性

赋值属性,不能和其它赋值属性一起使用,配置该属性时会默认为新生成的类设置常量值。如:

public class ClassA {private String a;
}public class ClassB {private String b;
}@Mapper(componentModel = "spring")
public interface TestMapStruct {@Mapping(target = "b", constant = "这是B属性");ClassB aToB(ClassA classA);
}

3.2.5 expression属性

赋值属性,这个属性决定了MapStruct的可扩展性,不能和其它赋值一起使用,支持按expression = "java(java语句)"的方式来设置字段需要执行的java语句。如:

public class ClassA {private String a;
}public class ClassB {private String b;
}@Mapper(componentModel = "spring")
public interface TestMapStruct {@Mapping(target = "b", constant = "java()");ClassB aToB(ClassA classA);
}

3.2.6 ignore属性

配置忽略target属性,如:

public class ClassA {private String a;
}public class ClassB {private String b;
}@Mapper(componentModel = "spring")
public interface TestMapStruct {@Mapping(target = "b", ignore = true);ClassB aToB(ClassA classA);
}

3.3 @Context的使用

@Context注解的参数将会作为方法的上下文传递到其它方法中,使用expression的java语法可对其进行操作。

3.3.1 集合传递自定义参数

MapStruct不支持集合映射时直接传递自定义参数,如下:

public class ClassA {private String a;private String test;
}public class ClassB {private String b;private String test;
}@Mapper(componentModel = "spring")
public interface TestMapStruct {/** 支持 */@Mapping(target = "b", ignore = true);List aToB(List classA);/** 不支持 */@Mapping(target = "b", ignore = true);List aToB(List classA, String test);
}

上面的的方式在编译时会报错。此时可以使用@Context注解来实现,如下:

public class ClassA {private String a;private String test;
}public class ClassB {private String b;private String test;
}@Mapper(componentModel = "spring")
public interface TestMapStruct {@Mapping(target = "b", ignore = true);@Mapping(target = "test", expression = "java(test)");List aToB(List classA, @Context String test);
}

3.3.2 函数式编程实现自定义功能

假设此时有个场景,需要对某个参数进行转换,但转换逻辑较为复杂,需要调用另一个实现类方法来完成,此时我们就可以使用@Context+expression来实现这种复杂的功能。如下:

public class ClassA {private String a;private String test;
}public class ClassB {private String b;private String test;
}@Mapper(componentModel = "spring")
public interface TestMapStruct {@Mapping(target = "b", ignore = true);@Mapping(target = "test", expression = "java(test.apply(classA))");List aToB(List classA, @Context Function test);
}

在调用时则只需要根据函数接口Function的操作方式传入对应的逻辑即可。@Contextexpression的组合可实现的功能非常多,这种使用方式只是抛砖引玉,Function完全也可以传入其它的实现类,在expression中编写调用方式也能实现。@Contextexpression组合基本能覆盖开发时的应用场景了。

如果要学习MapStruct的更多使用方式,推荐阅读MapStruct官方文档。

上一篇:20230314 ax

下一篇:MQTT之mosquitto

相关内容

热门资讯

文艺节目主持词 文艺节目主持词四篇  主持词要把握好吸引观众、导入主题、创设情境等环节以吸引观众。在一步步向前发展的...
幼儿园六一儿童节主持词 幼儿园六一儿童节主持词尊敬的各位来宾、各位朋友大家下午好!沐浴着和风丽日,我们即将迎来花团锦簇、芳香...
教师节表彰大会校长的致辞 教师节表彰大会校长的致辞范文(精选6篇)  在平平淡淡的日常中,要用到致辞的地方还是很多的,致辞讲求...
婚礼开场白主持词 婚礼开场白主持词  利用在中国拥有几千年文化的诗词能够有效提高主持词的感染力。随着社会一步步向前发展...
会主持人开场白台词 会主持人开场白台词2013年会主持人开场白台词    甲:新年的钟声即将敲响,时光的车轮又留下了一道...
领导主持词 领导主持词三篇  主持词已成为各种演出活动和集会中不可或缺的一部分。在现今人们越来越重视活动氛围的社...
升学宴致辞 升学宴致辞(精选15篇)  在现实生活或工作学习中,大家一定都接触过致辞吧,致辞具有“礼仪性”或“仪...
农村白事的主持词开场白 农村白事的主持词开场白(精选10篇)  在发展不断提速的社会中,越来越多的人会用到开场白,好的开场白...
生日主持词的开场白   生日主持词开场白(一)  各位同事和寿星们,各人晚顶好!在这天高气爽、丹桂飘喷鼻的夸姣季候,咱们...
旅游文化节主持词 旅游文化节主持词  主持词的写作需要将主题贯穿于所有节目之中。现今社会在不断向前发展,主持人参与的事...
主持人串词 主持人串词  一、串词的语言特征  (串词的语言,可以说是用尽了所有的修辞手法,我们不可能去全讲,因...
浪漫婚礼司仪主持词 浪漫婚礼司仪主持词  主持词是主持人在台上表演的灵魂之所在。在现在的社会生活中,很多场合都需要主持人...
公司迎春晚会的主持词 公司迎春晚会的主持词  主持词的写作需要将主题贯穿于所有节目之中。在当今不断发展的世界,主持人在活动...
少儿节目主持词 精选少儿节目主持词4篇  主持词已成为各种演出活动和集会中不可或缺的一部分。随着社会一步步向前发展,...
王家卫电影经典台词 王家卫电影经典台词(精选50句)  我们爱看王家卫的电影,不止爱他所创造的那个光影世界,更爱他电影中...
演唱会主持台词 演唱会主持台词  (甲)尊敬的各位领导,  (乙)各位来宾,  (甲)敬爱的老师,  (乙)亲爱的同...
《你的名字》经典台词 《你的名字》经典台词  你的名字,是谁的心事,还记得你的名字里面的经典台词吗?以下是小编为你精心整理...
教研活动主持词 教研活动主持词  主持人在台上表演的灵魂就表现在主持词中。在当下的中国社会,主持成为很多活动不可或缺...
艺术节主持词开场白 艺术节主持词开场白  什么是艺术节  艺术节是文艺工作者及艺术家、艺术爱好者之间学术交流与学习的重要...
老板在公司年会致辞 老板在公司年会致辞15篇  在平平淡淡的学习、工作、生活中,大家最不陌生的就是致辞了吧,致辞具有针对...