关于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); |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南