当前位置: 首页 > news >正文

在springboot3.4.4和jdk17环境下集成使用mapstruct

在springboot3.4.4和jdk17环境下集成使用mapstruct

MapStruct可以减少编码量,dto,entity相互转换时,自动生成set,get方法的调用。
源码地址:https://gitcode.com/qq_39339588/mapstruct.git

2025-04-21

一、maven依赖

<properties><java.version>17</java.version><maven.compiler.source>${java.version}</maven.compiler.source><maven.compiler.target>${java.version}</maven.compiler.target><org.projectlombok.version>1.18.16</org.projectlombok.version><org.mapstruct.version>1.6.3</org.mapstruct.version></properties>
<!--mapStruct依赖-->
<!-- mapstruct  -->
<dependency><groupId>org.mapstruct</groupId><artifactId>mapstruct</artifactId><version>${org.mapstruct.version}</version>
</dependency>
<!-- lombok dependency should not end up on classpath -->
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>${org.projectlombok.version}</version><scope>provided</scope>
</dependency><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>${java.version}</source><target>${java.version}</target><annotationProcessorPaths><path><groupId>org.mapstruct</groupId><artifactId>mapstruct-processor</artifactId><version>${org.mapstruct.version}</version></path><path><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>${org.projectlombok.version}</version></path><!-- additional annotation processor required as of Lombok 1.18.16 --><path><groupId>org.projectlombok</groupId><artifactId>lombok-mapstruct-binding</artifactId><version>0.2.0</version></path></annotationProcessorPaths></configuration></plugin></plugins></build>

建议安装插件 mapstruct support,按 ctrl + 鼠标左键 ,会跳转到参数对应的类

二、准备实体类

package space.goldchen.mapstruct.entity;import lombok.Data;
import lombok.Getter;
import lombok.Setter;/***  对象1* @author 2021* @create 2025-04-18 16:41*/
@Data
public class Pig {/*** id*/private Long id;/*** 姓名*/private String name;/*** 年龄*/private Integer age;/*** 价格*/private Double price;
}
package space.goldchen.mapstruct.entity;import lombok.Data;/*** @author 2021* @create 2025-04-18 16:50*/
@Data
public class Person {private Long id;private String name;
}

三、准备DTO

package space.goldchen.mapstruct.dto;import lombok.Data;/*** @author 2021* @create 2025-04-18 16:44*/
@Data
public class PigDto {private Long id;private String name;private Integer age;
}
package space.goldchen.mapstruct.dto;import lombok.Data;/*** @author 2021* @create 2025-04-18 16:46*/
@Data
public class PersonDto {private Long idid;private String namename;private String fullName;
}

四、创建Mapper映射

1. 创建公用接口

package space.goldchen.mapstruct.mapper;/*** @author 2021* @create 2025-04-21 09:17*/import java.util.List;/*** 转换对象的属性名称一致时,可以省略Mappings的对应关系设置,使用泛型比较合适* mapstruct 公共类* <DTO,Entity>*/
public interface BaseMapper<D, E> {/*** entity转 DTO** @param entity* @return*/D toDto(E entity);/*** DTO 转 entity** @param dto* @return*/E toEntity(D dto);/*** entity集合 转 DTO集合** @param entityList* @return*/List<D> toDto(List<E> entityList);/*** DTO集合 转 entity集合** @param dtoList* @return*/List<E> toEntity(List<D> dtoList);
}

2. 创建PigDtoMapper映射关系

@Mapper(componentModel = “spring”,unmappedTargetPolicy = ReportingPolicy.IGNORE)

package space.goldchen.mapstruct.mapper;import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;
import org.mapstruct.ReportingPolicy;
import space.goldchen.mapstruct.dto.PigDto;
import space.goldchen.mapstruct.entity.Pig;/*** @author 2021* @create 2025-04-18 16:52*/
@Mapper(componentModel = "spring",unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface PigDtoMapper extends BaseMapper<PigDto,Pig> {/***  pig转为pigDto* @param pig* @return*/@Mappings({// 属性名称一致时,可以省略@Mapping(source = "id", target = "id"),@Mapping(source = "name", target = "name"),@Mapping(source = "age", target = "age")})public PigDto toDto(Pig pig);}

3. 创建PersonMapper映射关系

package space.goldchen.mapstruct.mapper;import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;
import org.mapstruct.ReportingPolicy;
import space.goldchen.mapstruct.dto.PersonDto;
import space.goldchen.mapstruct.entity.Person;/*** @author 2021* @create 2025-04-21 11:24*/
@Mapper(componentModel = "spring",unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface PersonMapper extends BaseMapper<PersonDto, Person>{@Mappings({// 属性名称一致时,可以省略@Mapping(source = "id", target = "idid"),@Mapping(source = "name", target = "namename"),@Mapping(source = "name", target = "fullName")})@OverridePersonDto toDto(Person entity);
}

五、调用测试

package space.goldchen.mapstruct;import ch.qos.logback.classic.Logger;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import space.goldchen.mapstruct.dto.PersonDto;
import space.goldchen.mapstruct.dto.PigDto;
import space.goldchen.mapstruct.entity.Person;
import space.goldchen.mapstruct.entity.Pig;
import space.goldchen.mapstruct.mapper.PersonMapper;
import space.goldchen.mapstruct.mapper.PigDtoMapper;@SpringBootTest
@Slf4j
class MapStructApplicationTests {@Resourceprivate PigDtoMapper pigDtoMapper;@Resourceprivate PersonMapper personMapper;@DisplayName("测试Pig转PigDto")@Testvoid testPigDtoMapper() {Pig pig = new Pig();pig.setId(1L);pig.setName("pig");pig.setAge(2);pig.setPrice(100.0);PigDto pigDto = pigDtoMapper.toDto(pig);log.info("pigDto:{}", pigDto);}@DisplayName("测试Person转PersonDto")@Testvoid testPersonToPersonDto () {Person person = new Person();person.setId(2L);person.setName("我是personName");PersonDto personDto = personMapper.toDto(person);log.info("personDto:{}", personDto);}}

七、更多细节

1. 设置默认值

@Mapping(source = "person.name",target = "personName",defaultValue = "默认值")

2. 使用表达式

// 目前java是唯一受支持的语言,达式必须以Java表达式的形式给出
// 注意: 这个属性不能与source()、defaultValue()、defaultExpression()、qualifiedBy()、qualifiedByName()或constant()一起使用。
@Mapping(target = "describe", source = "describe", defaultValue = "默认值")
@Mapping(target = "createTime",expression = "java(new java.util.Date())")
PersonDTO conver(Person person);
@Mapping(target = "created",expression = "java(cn.hutool.core.date.DateTime.now())")

3. 类中的子类转换

// uses 成员类,子类
@Mapper(componentModel = "spring", uses = {Log3InnerMapper.class},unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface Log3Mapper extends BaseMapper<Log3DTO, Log3> {}

4. Map的转换

// MapMapping  map集合使用
@Mapperpublic interface SimpleMapper {@MapMapping(valueDateFormat = "dd.MM.yyyy")Map<String, String> longDateMapToStringStringMap(Map<Long, Date> source);}

5. 逆转换

// 使用注释`@InheritInverseConfiguration`表示方法应继承相应反向方法的反向配置
@Mapping(target = "age",source = "age", numberFormat = "#0.00")
PersonDTO conver(Person person);@InheritInverseConfiguration
Person conver(PersonDTO dto);
http://www.xdnf.cn/news/63037.html

相关文章:

  • 使用Postman调测“获取IAM用户Token”接口实际操作
  • 性能比拼: Nginx vs Apache
  • nn.LayerNorm():对输入张量的最后一个维度(特征维度)进行归一化
  • 【目标检测】目标检测综述 目标检测技巧
  • 全球首个人形机器人半程马拉松技术分析:翻车名场面背后的突破与挑战
  • DeepSeek赋能Nuclei:打造网络安全检测的“超级助手”
  • 量化研究---小果全球大类低相关性动量趋势增强轮动策略实盘设置
  • ThinkPHP5 的 SQL 注入漏洞
  • 【时时三省】(C语言基础)循环的嵌套和几种循环的比较
  • STM32——新建工程并使用寄存器以及库函数进行点灯
  • DeepSeek 大模型 + LlamaIndex + MySQL 数据库 + 知识文档 实现简单 RAG 系统
  • electron从安装到启动再到打包全教程
  • Python 网络编程:TCP 与 UDP 协议详解及实战代码
  • uni-app 开发企业级小程序课程
  • LangChain、LlamaIndex 和 ChatGPT 的详细对比分析及总结表格
  • 【Flink SQL实战】 UTC 时区格式的 ISO 时间转东八区时间
  • 2025.04.20【Lollipop】| Lollipop图绘制命令简介
  • python——函数
  • Unocss 类名基操, tailwindcss 类名
  • 分数线降低,25西电马克思主义学院(考研录取情况)
  • RESTful学习笔记(一)
  • 国产仪器进化论:“鲁般号”基于无人机的天线测试系统
  • 微软Entra新安全功能引发大规模账户锁定事件
  • 【Vue】组件基础
  • Linux系统下docker 安装 redis
  • Mybatis延迟加载、懒加载、二级缓存
  • 统计图表ECharts
  • 2025年世界职业院校技能大赛实施方案(意见稿)
  • 【单片机 C语言】单片机学习过程中常见C库函数(学习笔记)
  • 由Ai生成的Linux 入门到精通学习路径