SpringBoot3集成MapstructPlus的實(shí)現(xiàn)
Mapstruct Plus 是 Mapstruct 的增強(qiáng)工具,在 Mapstruct 的基礎(chǔ)上,實(shí)現(xiàn)了自動生成 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> <!-- 定義了一個注解處理器的依賴項(xiàng), 必須手動配置到此處,才能在編譯階段生成具體的映射實(shí)現(xiàn)類,避免運(yùn)行時的性能開銷 -->
<version>${mapstruct-plus.version}</version>
</path>
<!-- 依賴地址:https://mvnrepository.com/artifact/org.projectlombok/lombok-mapstruct-binding
解決 Lombok 與 MapStruct 的編譯順序沖突
強(qiáng)制 Lombok 在 MapStruct 處理完映射代碼后再運(yùn)行,從而避免字段缺失或無法識別的問題
官網(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 注解處理器不會自動加入。
所以此處需顯式添加 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) // 自動生成一個私有的無參構(gòu)造方法(禁止實(shí)例化:構(gòu)造函數(shù)是私有的,意味著這個類 不能從外部被實(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)前類與 DeptEntity.class 之間的字段對應(yīng)關(guān)系,reverseConvertGenerate = false 表示不生成反向轉(zhuǎn)換方法。
public class DeptAddForm {
/**
* 部門名稱
*/
@NotBlank(message = "部門名稱不能為空")
@Length(min = 1, max = 30, message = "部門名稱長度不能超過{max}個字符")
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í)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06
SpringMVC Mybatis配置多個數(shù)據(jù)源并切換代碼詳解
這篇文章主要介紹了SpringMVC Mybatis配置多個數(shù)據(jù)源并切換代碼詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-11-11
java中ImageReader和BufferedImage獲取圖片尺寸實(shí)例
這篇文章主要介紹了java中ImageReader和BufferedImage獲取圖片尺寸實(shí)例,具有一定借鑒價值,需要的朋友可以參考下2018-01-01
SpringBoot中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

