240
世界上有2种人,一种懂二进制,另一种不懂二进制。

关于mapStruct

遇到问题

  • 可以解决Convert后手动set的问题
  • 可解决多数据源同时转换的问题

官方文档

  https://mapstruct.org/documentation/stable/reference/html/#non-shipped-annotations

mapStruct的常用操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
同名同属性字段转换
//无需特别声明 直接转换即可
Target convertToTarget(Source source)
 
不同名同属性字段转换
//需要使用@Mapping注解指定转换字段的名称
//解释:source中的number转换为tagert中的myNumber
@Mapping(source = "number", target = "myNumber")
Target differentNameConvert(Source source);
 
默认值的使用
//需使用@Mapping中的defaultValue字段进行标识
//解释:若age字段为null,则使用defaultValue的值
@Mapping(source = "age", target = "age", defaultValue = "34")
Target defaultValueConvert(Source source);
 
常量的使用
//需使用@Mapping中的constant字段进行标识
//解释:不论target中的oldNumber转换值是什么,最后都使用constant的值
@Mapping(target = "oldNumber", constant = "35")
Target constantConvert(Source source);
 
忽略某个字段转换
//需使用@Mapping中的ignore字段进行标识
//解释:忽略target中的name字段转换 不论source中name的值是什么 最后tagert中的name值都是null
@Mapping(target = "name", ignore = true)
Target ignoreConvert(Source source);
 
单独参数转换
//需标明单独参数转换后的字段名称
//解释:将传入的sex字段传递给target中的sex
@Mapping(source = "sex", target = "sex")
Target aloneParmConvert(Integer sex);
 
更新数据源
//需使用@MappingTarget字段标明
//解释:将SonTarget中的值更新给Target 要改变谁 在谁前面加@MappingTarget
void updateTargetConvert(@MappingTarget Target target, SonTarget sonTarget);
 
自定义数据类型转换
default Target myConvert(Source source) {
    // some mapping logic
}
 
多数据源转换
//需使用@Mapping标明转换时参数传递的规则
//解释:将source中的ignore字段值传递到target的ignore 将sourceTwo的id字段值传递到target中的id
@Mappings({
        @Mapping(source = "source.ignore", target = "ignore"),
        @Mapping(source = "sourceTwo.id", target = "id")
})
SonTarget multiSourceConvert(Source source, SourceTwo sourceTwo);
 
表达式的使用
//需使用@Mapping中的expression字段标识所使用的表达式
//解释:引用Java表达式中DateTuil中的date方法处理date的转换逻辑  全路径
@Mapping(target = "stringDate", expression = "java(cn.hutool.core.date.DateUtil.date(date))")
SonTarget expressionConvert(Date date);
       
//解释:可在接口上面的@Mapper中引入某个类,这样就可以直接写方法,不用写全路径
@Mapper(imports = {DateUtil.class})
@Mapping(target = "date", expression = "java(DateUtil.date(date))")
SonTarget expressionConvert(Date date);
 
子父类转换
//需使用@BeanMapping指定返回的类型
//解释:SonTarget是Target的子类,该方法用父类接受,返回子类属性
@BeanMapping(resultType = SonTarget.class)
Target childenConvert(Source source);
 
逆向转换
//需使用InheritInverseConfiguration标识,该注解是根据源和目标的类型去自动识别,若存在多个相同源转换目标的方法时,需指定逆向转换的方法
//解释:将differentNameConvert方法进行逆向转换
//优点:若原differentNameConvert方法上有很多@Mapping规则的话,无需再次书写即可使用
@InheritInverseConfiguration(name = "differentNameConvert")
Source convertToSource(Target target);
 
dateFormat的使用
//需使用@mapping中的dateFormat注解进行标识转换的形式
//解释:source.date字段转换为target中的stringDate,转换格式为dateFormat指定的格式
@Mappings({
      @Mapping(source = "source.date", target = "stringDate", dateFormat = "yyyy-MM-dd HH:mm:ss"),  //Date转换成String
      @Mapping(source = "source.stringDate", target = "date", dateFormat = "yyyy-MM-dd HH:mm"//String转换成Date
})
Target childenConvert(Source source);
 
numberFormat的使用
//解释:String转数字类型后若想指定数字类型的格式可使用numberFormat指定
@Mapping(target = "number", numberFormat = "#.00")
Target differentTypeConvert(Source source);
 
@BeforeMapping的使用
//解释:在转换之前对某个实体进行操作
@BeforeMapping
default void beforeConvert(Source source){
    // some mapping logic
 
@AfterMapping的使用
//解释:在转换之后对某个实体进行操作
@AfterMapping
default void afterConvert(Source source){
    // some mapping logic
}
 
集合转换-无特殊要求
//解释:直接定义转换方法即可,MapStruct会自动生成Source转换成Target的方法,然后循环去调用
List<Target> convertToTargets(List<Source> sources);
 
集合转换-需自定义规则
//解释:自定义Source转换Target规则,MapStruct会自动调用sourceConvertToTarget方法来替代他自己生成的方法
//此时自定义规则才会生效
List<Target> convertToTargets(List<Source> sources);
 
@Mapping(source = "name", target = "name2")
Target sourceConvertToTarget(Source source);
 
集合转换-需自定义规则(存在多个自定义规则)
//解释:存在多个转换方法时,MapStruct无法自动选择,此时需使用@IterableMapping与@Named联合指定
//qualifiedByName指定调用的转换规则,@Named标明被调用的名称,这里的两个名称需一致
@IterableMapping(qualifiedByName = "sourceTwoConvertToTarget")
List<Target> convertToTargets(List<SourceTwo> sourceTwos);
 
@Mapping(source = "name", target = "name2")
@Named("sourceTwoConvertToTarget")
Target sourceTwoConvertToTarget(SourceTwo sourceTwo);
 
Target sourceTwoConvertToTarge2(SourceTwo sourceTwo);

  

 

posted @   _Origin  阅读(227)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
点击右上角即可分享
微信分享提示