SpringBoot3集成MapstructPlus的實(shí)現(xiàn)
Mapstruct Plus 是 Mapstruct 的增強(qiáng)工具,在 Mapstruct 的基礎(chǔ)上,實(shí)現(xiàn)了自動(dòng)生成 Mapper 接口的功能,并強(qiáng)化了部分功能,使 Java 類型轉(zhuǎn)換更加便捷、優(yōu)雅。 www.mapstruct.plus/
引入依賴
根pom.xml
<properties> <java.version>21</java.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <!-- 插件版本 --> <maven-compiler-plugin.version>3.11.0</maven-compiler-plugin.version> <lombok.version>1.18.38</lombok.version> <mapstruct-plus.version>1.4.8</mapstruct-plus.version> <lombok-mapstruct-binding.version>0.2.0</lombok-mapstruct-binding.version> </properties> <dependencyManagement> <dependencies> <!-- MapStructPlus 依賴 https://mvnrepository.com/artifact/io.github.linpeilie/mapstruct-plus-spring-boot-starter --> <dependency> <groupId>io.github.linpeilie</groupId> <artifactId>mapstruct-plus-spring-boot-starter</artifactId> <version>${mapstruct-plus.version}</version> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <!-- Maven 編譯插件 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>${maven-compiler-plugin.version}</version> <configuration> <source>${java.version}</source> <!-- 源代碼使用的JDK版本 --> <target>${java.version}</target> <!-- 需要生成的目標(biāo)class文件的編譯版本 --> <encoding>${project.build.sourceEncoding}</encoding> <!-- 字符集編碼,防止中文亂碼 --> <compilerArgs> <arg>-parameters</arg> <!-- 保留方法參數(shù)名稱 --> </compilerArgs> <annotationProcessorPaths> <path> <groupId>io.github.linpeilie</groupId> <artifactId>mapstruct-plus-processor</artifactId> <!-- 定義了一個(gè)注解處理器的依賴項(xiàng), 必須手動(dòng)配置到此處,才能在編譯階段生成具體的映射實(shí)現(xiàn)類,避免運(yùn)行時(shí)的性能開銷 --> <version>${mapstruct-plus.version}</version> </path> <!-- 依賴地址:https://mvnrepository.com/artifact/org.projectlombok/lombok-mapstruct-binding 解決 Lombok 與 MapStruct 的編譯順序沖突 強(qiáng)制 Lombok 在 MapStruct 處理完映射代碼后再運(yùn)行,從而避免字段缺失或無法識(shí)別的問題 官網(wǎng)提示:https://mapstruct.org/documentation/stable/reference/html/#lombok --> <path> <groupId>org.projectlombok</groupId> <artifactId>lombok-mapstruct-binding</artifactId> <version>${lombok-mapstruct-binding.version}</version> </path> <!-- 一旦你使用了 <annotationProcessorPaths>,Maven 將只使用你指定的處理器,默認(rèn)的 Lombok 注解處理器不會(huì)自動(dòng)加入。 所以此處需顯式添加 Lombok 注解處理器 依賴 --> <path> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>${lombok.version}</version> </path> </annotationProcessorPaths> </configuration> </plugin> </plugins> </build>
封裝工具類
公共模塊pom.xml
<dependencies> <!-- 包含:SpringUtils --> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-extra</artifactId> </dependency> <!-- mapstruct-plus映射工具類 --> <dependency> <groupId>io.github.linpeilie</groupId> <artifactId>mapstruct-plus-spring-boot-starter</artifactId> </dependency> </dependencies>
工具類MapstructUtils.java
package com.zibocoder.plugins.common.util; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.extra.spring.SpringUtil; import io.github.linpeilie.Converter; import lombok.AccessLevel; import lombok.NoArgsConstructor; import java.util.List; import java.util.Map; /** * @author zibocoder * @date 2025/7/19 17:34:58 * @description Mapstruct工具類 */ @NoArgsConstructor(access = AccessLevel.PRIVATE) // 自動(dòng)生成一個(gè)私有的無參構(gòu)造方法(禁止實(shí)例化:構(gòu)造函數(shù)是私有的,意味著這個(gè)類 不能從外部被實(shí)例化) public class MapstructUtils { private final static Converter CONVERTER = SpringUtil.getBean(Converter.class); /** * 將 T 類型對象,轉(zhuǎn)換為 desc 類型的對象并返回 * * @param source 數(shù)據(jù)來源實(shí)體 * @param desc 描述對象 轉(zhuǎn)換后的對象 * @return desc */ public static <T, V> V convert(T source, Class<V> desc) { if (ObjectUtil.isNull(source)) { return null; } if (ObjectUtil.isNull(desc)) { return null; } return CONVERTER.convert(source, desc); } /** * 將 T 類型對象,按照配置的映射字段規(guī)則,給 desc 類型的對象賦值并返回 desc 對象 * * @param source 數(shù)據(jù)來源實(shí)體 * @param desc 轉(zhuǎn)換后的對象 * @return desc */ public static <T, V> V convert(T source, V desc) { if (ObjectUtil.isNull(source)) { return null; } if (ObjectUtil.isNull(desc)) { return null; } return CONVERTER.convert(source, desc); } /** * 將 T 類型的集合,轉(zhuǎn)換為 desc 類型的集合并返回 * * @param sourceList 數(shù)據(jù)來源實(shí)體列表 * @param desc 描述對象 轉(zhuǎn)換后的對象 * @return desc */ public static <T, V> List<V> convert(List<T> sourceList, Class<V> desc) { if (ObjectUtil.isNull(sourceList)) { return null; } if (CollUtil.isEmpty(sourceList)) { return CollUtil.newArrayList(); } return CONVERTER.convert(sourceList, desc); } /** * 將 Map 轉(zhuǎn)換為 beanClass 類型的集合并返回 * * @param map 數(shù)據(jù)來源 * @param beanClass bean類 * @return bean對象 */ public static <T> T convert(Map<String, Object> map, Class<T> beanClass) { if (MapUtil.isEmpty(map)) { return null; } if (ObjectUtil.isNull(beanClass)) { return null; } return CONVERTER.convert(map, beanClass); } }
實(shí)際應(yīng)用
DeptAddForm->DeptEntity DeptAddForm.java
package com.zibocoder.system.domain.form; import com.zibocoder.system.domain.entity.DeptEntity; import io.github.linpeilie.annotations.AutoMapper; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; import lombok.Data; import org.hibernate.validator.constraints.Length; /** * @author zibocoder * @date 2025/7/13 06:54:08 * @description 部門添加表單 */ @Data @AutoMapper(target = DeptEntity.class, reverseConvertGenerate = false) //自動(dòng)映射當(dāng)前類與 DeptEntity.class 之間的字段對應(yīng)關(guān)系,reverseConvertGenerate = false 表示不生成反向轉(zhuǎn)換方法。 public class DeptAddForm { /** * 部門名稱 */ @NotBlank(message = "部門名稱不能為空") @Length(min = 1, max = 30, message = "部門名稱長度不能超過{max}個(gè)字符") private String deptName; /** * 父部門ID */ @NotNull(message = "父部門ID不能為空") private Long parentId; /** * 排序 */ @NotNull(message = "顯示順序不能為空") private Integer theSort; /** * 備注 */ private String remark; }
DeptEntity.java
package com.zibocoder.system.domain.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; /** * @author zibocoder * @date 2025/7/10 08:16:20 * @description 部門實(shí)體對象 */ @Data @TableName(value = "sys_dept", autoResultMap = true) public class DeptEntity { /** * 部門ID */ @TableId(type = IdType.AUTO) private Long deptId; /** * 部門名稱 */ private String deptName; /** * 父部門ID */ private Long parentId; /** * 祖級列表 */ private String ancestors; /** * 排序 */ private String theSort; /** * 部門狀態(tài):是否被禁用 false-0否 true-1是 */ private Boolean disabledFlag; /** * 備注 */ private String remark; }
業(yè)務(wù)類 DeptService.java
/** * 新增部門 * @param deptAddForm 部門新增表單 * @return 響應(yīng)結(jié)果 */ public ResponseResult<Void> addDept(DeptAddForm deptAddForm) { ... DeptEntity deptEntity = MapstructUtils.convert(deptAddForm, DeptEntity.class); ... deptMapper.insert(deptEntity); return ResponseResult.ok(); }
到此這篇關(guān)于SpringBoot3集成MapstructPlus的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)SpringBoot3 MapstructPlus內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot配置數(shù)據(jù)庫密碼加密的方法
由于系統(tǒng)安全的考慮,配置文件中不能出現(xiàn)明文密碼的問題,本文就給大家詳細(xì)介紹下springboot配置數(shù)據(jù)庫密碼加密的方法,下面話不多說了,來一起看看詳細(xì)的介紹吧,需要的朋友可以參考下2023-08-08淺談Java中ArrayList的擴(kuò)容機(jī)制
本文主要介紹了淺談Java中ArrayList的擴(kuò)容機(jī)制,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06SpringMVC Mybatis配置多個(gè)數(shù)據(jù)源并切換代碼詳解
這篇文章主要介紹了SpringMVC Mybatis配置多個(gè)數(shù)據(jù)源并切換代碼詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11java中ImageReader和BufferedImage獲取圖片尺寸實(shí)例
這篇文章主要介紹了java中ImageReader和BufferedImage獲取圖片尺寸實(shí)例,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01SpringBoot中Bean生命周期自定義初始化和銷毀方法詳解
這篇文章給大家詳細(xì)介紹了SpringBoot中Bean生命周期自定義初始化和銷毀方法,文中通過代碼示例講解的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-01-01關(guān)于Mybatis-Plus?Wrapper是否應(yīng)該出現(xiàn)在Servcie類中
最近在做代碼重構(gòu),代碼工程采用了Controller/Service/Dao分層架構(gòu),Dao層使用了Mybatis-Plus框架,本文帶領(lǐng)大家學(xué)習(xí)Mybatis-Plus?Wrapper應(yīng)該出現(xiàn)在Servcie類中嗎,需要的朋友可以參考下2023-05-05