【Spring Boot后端組件】mybatis-plus使用

文章目錄

  • mybatis-plus使用
    • 一、依賴引入
    • 二、添加相關配置項
    • 三、功能詳解
      • 1.自增主鍵
      • 2.邏輯刪除
      • 3.操作時間自動填充
      • 4.其他字段自動填充
      • 5.分頁查詢
      • 6.自定義動態查詢
      • 7.代碼生成器
      • 8.代碼生成器(自定義模板)

mybatis-plus使用

一、依賴引入

pom.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.4</version><relativePath/></parent><artifactId>mybatis-plus-demo</artifactId><dependencies><!-- 實現對數據庫連接池的自動化配置 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><dependency> <!-- 本示例,我們使用 MySQL --><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.48</version></dependency><!-- 實現對 MyBatis Plus 的自動化配置 --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.2.0</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency></dependencies></project>

二、添加相關配置項

application.yaml

spring:# datasource 數據源配置內容datasource:url: jdbc:mysql://127.0.0.1:3306/test-user?useSSL=false&useUnicode=true&characterEncoding=UTF-8driver-class-name: com.mysql.jdbc.Driverusername: rootpassword: root1234

三、功能詳解

1.自增主鍵

CREATE TABLE auto_increment (id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主鍵',name VARCHAR(100) NOT NULL COMMENT '名稱',create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間'
) COMMENT='主鍵自增表';

表單說明:在數據庫軟件如navicat中直接插入數據時,數據呈現主鍵自增情況,但使用mybatis-plus直接插入數據則不會。
(1)直接為實體id字段添加注解@TableId(type = IdType.AUTO),加上此注解后插入的數據就可以實現主鍵自增了。
實體類如下:

@TableName(value = "auto_increment")
@Data
public class AutoIncrementDO {@TableId(type = IdType.AUTO)private Long id;private String name;private LocalDateTime createTime;
}

(2)全局配置,在配置文件中加入以下配置

mybatis-plus:global-config:db-config:id-type: auto # 全局主鍵策略

實體類如下:

@TableName(value = "auto_increment")
@Data
public class AutoIncrementDO {// 字段名id時會自動識別為主鍵,否則需要加上 @TableId 注解private Long id;private String name;private LocalDateTime createTime;
}

ps:數據庫主鍵必須設置為自增,否則會報錯

2.邏輯刪除

CREATE TABLE logic_delete (id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主鍵',name VARCHAR(50) NOT NULL COMMENT '名稱',create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時間',deleted BIT NOT NULL DEFAULT FALSE COMMENT '是否刪除'
) COMMENT='邏輯刪除表';

表單說明:deleted字段默認設為false即0,刪除數據時值需要將deleted字段置為1即可,不需要真正的刪除數據。

mybatis-plus如何實現這一需求呢?
(1)直接在表示邏輯刪除的字段上添加注解@TableLogic即可,默認值為0,刪除值為1,若想反過來需要自定義@TableLogic(value = "1", delval = "0")或者@TableLogic(value = "false", delval = "true")
(2)全局配置:表示刪除的字段上添加注解@TableLogic,全局配置默認值和刪除值,配置如下。

mybatis-plus:global-config:db-config:logic-not-delete-value: 0 # 邏輯未刪除值(默認為 0)logic-delete-value: 1 # 邏輯已刪除值(默認為 1)

ps:若字段上的注解不僅僅為@TableLogic,而是例如@TableLogic(value = "1", delval = "0")等情況,那么該表的邏輯刪除按該注解來,即該表0表示刪除

3.操作時間自動填充

CREATE TABLE auto_update_time (id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主鍵',content VARCHAR(255) NOT NULL COMMENT '名稱',create_time TIMESTAMP DEFAULT NULL COMMENT '創建時間',update_time TIMESTAMP DEFAULT NULL COMMENT '更新時間'
)COMMENT='時間自動更新表';

表單說明:為不產生影響,數據庫中創建時間與更新時間不設置默認值,也不自動更新。

mybatis-plus實現操作時間自動填充以及更新步驟如下:
①字段上添加如下注解:

@Data
@TableName("auto_update_time")
public class AutoUpdateTimeDO {@TableId(type = IdType.AUTO)private Long id;private String content;@TableField(fill = FieldFill.INSERT)private LocalDateTime createTime;@TableField(fill = FieldFill.INSERT_UPDATE)private LocalDateTime updateTime;
}

②實現 MetaObjectHandler 接口:

@Component
public class DefaultDBFieldHandler implements MetaObjectHandler {@Overridepublic void insertFill(MetaObject metaObject) {setInsertFieldValByName("createTime", LocalDateTime.now(), metaObject);setInsertFieldValByName("updateTime", LocalDateTime.now(), metaObject);}@Overridepublic void updateFill(MetaObject metaObject) {setUpdateFieldValByName("updateTime", LocalDateTime.now(), metaObject);}
}

4.其他字段自動填充

如創建人與更新人自動填充,這里會和創建時間以及更新時間自動填充一起,二者實現都需要實現MetaObjectHandler接口。
實現如下:
①字段上添加如下注解:

@Data
@TableName(value = "auto_fill_operator")
public class AutoFillOperatorDO extends BaseDO{@TableId(type = IdType.AUTO)private Long id;private String content;
}
@Data
public class BaseDO {@TableField(fill = FieldFill.INSERT)private String creator;@TableField(fill = FieldFill.INSERT_UPDATE)private String updater;@TableField(fill = FieldFill.INSERT)private LocalDateTime createTime;@TableField(fill = FieldFill.INSERT_UPDATE)private LocalDateTime updateTime;
}

②實現 MetaObjectHandler 接口:

@Component
public class DefaultDBFieldHandler implements MetaObjectHandler {@Overridepublic void insertFill(MetaObject metaObject) {if (metaObject.getOriginalObject() instanceof BaseDO) {BaseDO baseDO = (BaseDO) metaObject.getOriginalObject();LocalDateTime current = LocalDateTime.now();// 創建時間為空,則填充當前時間if (Objects.isNull(baseDO.getCreateTime())) {baseDO.setCreateTime(current);}// 更新時間為空,則填充當前時間if (Objects.isNull(baseDO.getUpdateTime())) {baseDO.setUpdateTime(current);}String user = "creator";// 創建人為空,則填充當前用戶if (Objects.isNull(baseDO.getCreator())) {baseDO.setCreator(user);}// 更新人為空,則填充當前用戶if (Objects.isNull(baseDO.getUpdater())) {baseDO.setUpdater(user);}}}@Overridepublic void updateFill(MetaObject metaObject) {// 更新時間為空,則以當前時間為更新時間Object modifyTime = getFieldValByName("updateTime", metaObject);if (Objects.isNull(modifyTime)) {setFieldValByName("updateTime", LocalDateTime.now(), metaObject);}// 當前登錄用戶不為空,更新人為空,則當前登錄用戶為更新人Object modifier = getFieldValByName("updater", metaObject);String user = "updater";if (Objects.isNull(modifier)) {setFieldValByName("updater", user, metaObject);}}
}

5.分頁查詢

@Mapper
public interface CrudBaseMaoper extends BaseMapper<CrudBaseDO> {
}
@Service
public class CrudBaseServiceImpl {@Resourceprivate CrudBaseMaoper crudBaseMaoper;public IPage<CrudBaseDO> page(String name) {// 構造分頁參數Page<CrudBaseDO> page = new Page<>(1, 10); // 當前頁, 每頁顯示條數QueryWrapper<CrudBaseDO> queryWrapper = new QueryWrapper<>();queryWrapper.lambda().like(CrudBaseDO::getCompanyName, name);return crudBaseMaoper.selectPage(page, queryWrapper);}

分頁查詢total為0,需要配置分頁插件,如下:

@Configuration
public class MybatisPlusConfig {// 分頁查詢攔截器,可以獲取total值@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); // 根據數據庫類型選擇return interceptor;}
}

6.自定義動態查詢

場景:在數據庫查詢中,經常遇到需要根據多個可選字段進行動態查詢的情況。傳統寫法需要為每個字段編寫判空邏輯,代碼冗長且重復。
通過自定義 LambdaQueryWrapper 擴展方法,實現簡潔的動態查詢:
示例:

public class LambdaQueryWrapperX<T> extends LambdaQueryWrapper<T> {public LambdaQueryWrapperX<T> likeIfPresent(SFunction<T, ?> column, String val) {if (StringUtils.hasText(val)) {return (LambdaQueryWrapperX<T>) super.like(column, val);}return this;}
}
@Mapper
public interface CrudProMapper extends BaseMapper<CrudProDO> {
}
@Service
public class CrudProServiceImpl implements CrudProService {@Resourceprivate CrudProMapper crudProMapper;@Overridepublic IPage<CrudProDO> getCrudProPage(CrudProPageReqVO reqVO) {IPage<CrudProDO> page = new Page<>(1, 10);return crudProMapper.selectPage(page, new LambdaQueryWrapperX<CrudProDO>().likeIfPresent(CrudProDO::getCompanyName, reqVO.getCompanyName()).likeIfPresent(CrudProDO::getCompanyCode, reqVO.getCompanyCode()));}
}

其他方法也可以一樣的實現,比如eqIfPresent

7.代碼生成器

(1)相關依賴

 <!-- 實現對 MyBatis Plus 的自動化配置 --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.3.1</version></dependency><!-- 代碼自動生成器--><!-- 與mybatis-plus版本保持一致--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>3.5.3.1</version></dependency><!-- 模板引擎依賴,默認使用 Velocity --><dependency><groupId>org.apache.velocity</groupId><artifactId>velocity-engine-core</artifactId><version>2.3</version></dependency><dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId></dependency>

(2)生成器代碼

import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;import java.util.Collections;public class CodeGenerator {public static void main(String[] args) {// 多模塊地址前綴,沒有可不寫String prefixPath = "/kaishu-sql-crud/kaishu-sql-crud-mybatis-plus-pro/";FastAutoGenerator.create("jdbc:mysql://127.0.0.1:3306/test-user?useSSL=false&useUnicode=true&characterEncoding=UTF-8","root","root1234").globalConfig(builder -> {builder.author("kaishu")       // 設置作者.outputDir(System.getProperty("user.dir") + prefixPath + "/src/main/java") // 輸出目錄.enableSwagger()        // 開啟swagger.fileOverride();        // 覆蓋已生成文件}).packageConfig(builder -> {builder.parent("org.kaishu.sql.crud.mybatis.plus.pro")    // 設置父包名.moduleName("generatordemo")     // 設置父包模塊名.pathInfo(Collections.singletonMap(OutputFile.xml,System.getProperty("user.dir") + prefixPath + "/src/main/resources/mapper")); // 設置mapperXml路徑}).strategyConfig(builder -> {builder.addInclude("t_auto_genarater", "t_test_auto_genarater") // 設置需要生成的表名.addTablePrefix("t_", "t_") // 設置過濾表前綴.entityBuilder()         // 實體類配置.enableLombok()         // 啟用Lombok.controllerBuilder()    // Controller配置.enableRestStyle()      // 啟用@RestController.mapperBuilder()        // Mapper配置.enableMapperAnnotation(); // 啟用@Mapper}).templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎.execute();}
}

更詳細的配置參考如下:
(1)實體類生成配置

.strategyConfig(builder -> {builder.entityBuilder().enableLombok() // 使用Lombok.enableChainModel() // 鏈式模型.enableRemoveIsPrefix() // 移除is前綴.enableTableFieldAnnotation() // 字段注解.versionColumnName("version") // 樂觀鎖字段名.logicDeleteColumnName("deleted") // 邏輯刪除字段名.naming(NamingStrategy.underline_to_camel) // 命名策略.columnNaming(NamingStrategy.underline_to_camel).addSuperEntityColumns("id", "create_time", "update_time") // 公共字段.formatFileName("%sEntity") // 文件名稱格式.addIgnoreColumns("is_deleted"); // 忽略字段
})

(2)Mapper生成配置

.strategyConfig(builder -> {builder.mapperBuilder().enableBaseResultMap() // 生成resultMap.enableBaseColumnList() // 生成columnList.enableMapperAnnotation() // @Mapper注解.formatMapperFileName("%sDao") // Mapper文件命名.formatXmlFileName("%sXml"); // Xml文件命名
})

(3)Service生成配置

.strategyConfig(builder -> {builder.serviceBuilder().formatServiceFileName("%sService") // Service接口命名.formatServiceImplFileName("%sServiceImpl"); // Service實現類命名
})

(4)Controller生成配置

.strategyConfig(builder -> {builder.controllerBuilder().enableRestStyle() // 使用@RestController.enableHyphenStyle() // 使用駝峰轉連字符.formatFileName("%sController") // 文件命名.enableFileOverride(); // 覆蓋已生成文件
})

8.代碼生成器(自定義模板)

示例:這里只自定義實體類生成模板,其余照舊,這里我需要讓實體類都繼承我已定義好的的類BaseDO

(1)依賴同上
(2)生成器代碼,基本同上

.strategyConfig(builder -> {...
})
// 加上這行代碼即可
.templateConfig(builder -> {builder.entity("/templates/custom-entity.java");})

(2)自定義實體模板文件,在\src\main\resources\templates\目錄下新建custom-entity.java.ftl文件,文件內容如下

package ${package.Entity};<#-- 基礎導入 -->
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.Data;
import lombok.EqualsAndHashCode;
<#-- 導入項目基礎類 -->
import org.kaishu.sql.crud.mybatis.plus.pro.dal.dataobject.BaseDO;<#-- 類注釋 -->
/**
* ${table.comment!} 實體類
*
* @author ${author}
* @since ${date}
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("${table.name}")
public class ${entity} extends BaseDO {private static final long serialVersionUID = 1L;<#-- 生成字段(自動排除BaseDO中已存在的字段) -->
<#list table.fields as field><#if !['id','create_time','update_time','creator','updater','deleted']?seq_contains(field.name)>/*** ${field.comment!}*/@TableField("${field.name}")private ${field.propertyType} ${field.propertyName};</#if>
</#list>
}

·

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/906171.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/906171.shtml
英文地址,請注明出處:http://en.pswp.cn/news/906171.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

docker compose 啟動指定的 service

使用 Docker Compose 啟動指定服務 要在 Docker Compose 中啟動特定的服務而不是所有服務&#xff0c;可以使用以下命令&#xff1a; docker compose up [服務名] 基本用法 啟動單個服務&#xff1a; docker compose up service_name 啟動多個指定服務&#xff1a; docker …

wordcount程序

### 在 IntelliJ IDEA 中編寫和運行 Spark WordCount 程序 要使用 IntelliJ IDEA 編寫并運行 Spark 的 WordCount 程序&#xff0c;需按照以下流程逐步完成環境配置、代碼編寫以及任務提交。 --- #### 1. **安裝與配置 IntelliJ IDEA** 確保已正確安裝 IntelliJ IDEA&#x…

SmartETL函數式組件的設計與應用

SmartETL框架主要采用了面向對象的設計思想&#xff0c;將ETL過程中的處理邏輯抽象為Loader和Processor&#xff08;對應loader模塊和iterator模塊&#xff09;&#xff0c;所有流程組件需要繼承或實現DataProvider&#xff08;iter方法&#xff09;或JsonIterator&#xff08;…

鴻蒙AI開發:10-多模態大模型與原子化服務的集成

鴻蒙AI開發&#xff1a;10-多模態大模型與原子化服務的集成 在鴻蒙生態中&#xff0c;多模態大模型與原子化服務的集成是一個重要課題。本文將介紹如何在鴻蒙平臺上進行多模態大模型與原子化服務的集成&#xff0c;以及相關的技術細節和實際案例。 鴻蒙AI開發概述 什么是鴻蒙AI…

python打卡day29@浙大疏錦行

知識點回顧 類的裝飾器裝飾器思想的進一步理解&#xff1a;外部修改、動態類方法的定義&#xff1a;內部定義和外部定義 作業&#xff1a;復習類和函數的知識點&#xff0c;寫下自己過去29天的學習心得&#xff0c;如對函數和類的理解&#xff0c;對python這門工具的理解等&…

20250516使用TF卡將NanoPi NEO core開發板出廠的Ubuntu core22.04.3系統降級到Ubuntu core16.04.2

20250516使用TF卡將NanoPi NEO core開發板出廠的Ubuntu core22.04.3系統降級到Ubuntu core16.04.2 2025/5/16 10:58 緣起&#xff1a;NanoPi NEO core核心板出廠預制的OS操作系統為Ubuntu core22.04.3系統。 【雖然是友善之臂提供的最新的系統&#xff0c;但是缺少很多用用程序…

密西根大學新作——LightEMMA:自動駕駛中輕量級端到端多模態模型

導讀 目前將自動駕駛與視覺語言模型&#xff08;VLMs&#xff09;結合的研究越來越火熱&#xff0c;VLMs已經證明了其對自動駕駛的重要作用。本文引入了一種用于自動駕駛的輕量級端到端多模態模型LightEMMA&#xff0c;它能夠集成和評估當前的商業和開源模型&#xff0c;以研究…

框架之下再看HTTP請求對接后端method

在當今的軟件開發領域&#xff0c;各類框架涌現&#xff0c;極大地提升了開發效率。以 Java 開發為例&#xff0c;Spring 框架不斷演進&#xff0c;Spring Boot 更是簡化到只需引入 Maven 包&#xff0c;添加諸如SpringBootApplication、RestController等注解&#xff0c;就能輕…

Vue+Go 自定義打字素材的打字網站

Typing_Key_Board 這是一個基于Vue 3和Go語言的自定義素材打字練習網站&#xff0c;靈感來源于常用字打字練習&#xff0c;解決了大多數網站無法自定義打字素材的問題。在 Typing_Key_Board (簡稱TKB)中&#xff0c;用戶可以自定義打字素材進行練習&#xff0c;在復習代碼的同…

開源物聯網平臺(OpenRemote)

在物聯網技術蓬勃發展的當下&#xff0c;OpenRemote作為一款強大的開源物聯網平臺&#xff0c;正逐漸在多個領域嶄露頭角。尤其是在智能能源管理領域&#xff0c;它為微電網和分布式能源網絡提供了全面且靈活的數據集成與管理方案&#xff0c;展現出獨特的優勢。 OpenRemote提供…

Spring Security與SaToken的對比與優缺點分析

Spring Security與SaToken對比分析 一、框架定位 Spring Security 企業級安全解決方案&#xff0c;深度集成Spring生態提供完整的安全控制鏈&#xff08;認證、授權、會話管理、攻擊防護&#xff09;適合中大型分布式系統 SaToken 輕量級權限認證框架&#xff0c;專注Token會…

每日一道leetcode(新學數據結構版)

208. 實現 Trie (前綴樹) - 力扣&#xff08;LeetCode&#xff09; 題目 Trie&#xff08;發音類似 "try"&#xff09;或者說 前綴樹 是一種樹形數據結構&#xff0c;用于高效地存儲和檢索字符串數據集中的鍵。這一數據結構有相當多的應用情景&#xff0c;例如自動…

【自然語言處理與大模型】大模型(LLM)基礎知識④

&#xff08;1&#xff09;微調主要用來干什么&#xff1f; 微調目前最主要用在定制模型的自我認知和改變模型對話風格。模型能力的適配與強化只是輔助。 定制模型的自我認知&#xff1a;通過微調可以調整模型對自我身份、角色功能的重新認知&#xff0c;使其回答更加符合自定義…

基于 Spring Boot 瑞吉外賣系統開發(十五)

基于 Spring Boot 瑞吉外賣系統開發&#xff08;十五&#xff09; 前臺用戶登錄 在登錄頁面輸入驗證碼&#xff0c;單擊“登錄”按鈕&#xff0c;頁面會攜帶輸入的手機號和驗證碼向“/user/login”發起請求。 定義UserMapper接口 Mapper public interface UserMapper exte…

什么是TCP協議?它存在哪些安全挑戰?

一、TCP協議概述 TCP&#xff08;傳輸控制協議&#xff09;是互聯網中面向連接、可靠的傳輸層協議&#xff0c;主要負責在不可靠的IP層上實現數據的可靠傳輸。其核心特點包括&#xff1a; 面向連接&#xff1a;通信前需通過三次握手&#xff08;SYN-SYN/ACK-ACK&#xff09;建…

12條熱門照片提示

12條熱門照片提示 1. 賽博朋克光彩 (Cyberpunk Glow-Up) 未在文件中顯示2. 卡通化我 (Cartoonify Me) Convert this image of [your subject here] into a 3D Pixar-style cartoon clean lines, soft lighting, expressive features, and a polished render that feels cine…

Java求職面試揭秘:從Spring到微服務的技術挑戰

文章簡述 在這篇文章中&#xff0c;我們將通過一個幽默的面試場景&#xff0c;揭秘互聯網大廠Java求職者在面試中面對的技術挑戰。面試官將從Spring框架、微服務架構到大數據處理等多個維度進行提問&#xff0c;并詳細講解這些技術點的應用場景和解決方案&#xff0c;幫助小白…

用Python輸出一個文件夾的所有文件結構

輸出一個文件夾的所有目錄和文件結構 新建一個Python文件&#xff0c;輸入 這個文件表示查詢一個文件夾所有的目錄結構 import osdef print_directory_structure(root_dir):"""打印樹狀目錄結構&#xff08;優化版&#xff09;"""if not os.p…

R語言的專業網站top5推薦

李升偉 以下是學習R語言的五個頂級專業網站推薦&#xff0c;涵蓋教程、社區、資源庫和最新動態&#xff1a; 1.R項目官網 (r-project.org) R語言的官方網站&#xff0c;提供軟件下載、文檔、手冊和常見問題解答。特別適合初學者和高級用戶&#xff0c;是獲取R語言核心資源的…

IntelliJ IDEA給Controller、Service、Mapper不同文件設置不同的文件頭注釋模板、Velocity模板引擎

通過在 IntelliJ IDEA 中的 “Includes” 部分添加多個文件頭模板&#xff0c;并在 “Files” 模板中利用這些包含來實現不同類型文件的注釋。以下是為 Controller、Service、Mapper 文件設置不同文件頭的完整示例&#xff1a; 1. 設置 Includes 文件頭模板 File > Settin…