MyBatis-Plus代碼生成器(AutoGenerator)用法及說明
1. 引言:MyBatis-Plus 代碼生成器概述
1.1 什么是 AutoGenerator?
MyBatis-Plus (MP) 代碼生成器,即 AutoGenerator,是 MyBatis-Plus 框架提供的一款高效工具。它的核心功能是根據(jù)數(shù)據(jù)庫表結(jié)構(gòu),一鍵生成項目所需的分層代碼,包括:
- Entity (實體類/Model)
- Mapper (持久層接口)
- Mapper XML (映射文件)
- Service (業(yè)務(wù)層接口及其實現(xiàn)類)
- Controller (控制層)
AutoGenerator 極大地減少了開發(fā)者在項目初期或數(shù)據(jù)庫表結(jié)構(gòu)變更時編寫大量重復(fù)的 CRUD 代碼的工作量,是 MyBatis-Plus 提高開發(fā)效率的關(guān)鍵工具之一 [1]。
1.2 核心優(yōu)勢
相比于傳統(tǒng)的手動編寫或舊版代碼生成器,MyBatis-Plus AutoGenerator 具有以下優(yōu)勢:
- 高度自動化:只需配置數(shù)據(jù)源和生成策略,即可完成全套代碼生成。
- 配置靈活:支持通過鏈?zhǔn)?API 進(jìn)行精細(xì)化配置,包括命名策略、包結(jié)構(gòu)、字段處理等。
- 模板豐富:內(nèi)置支持 Velocity、Freemarker、Beetl 等多種模板引擎,并允許用戶完全自定義代碼模板,以適應(yīng)不同的項目規(guī)范。
- 現(xiàn)代 API:從 3.5.1 版本開始,引入了
FastAutoGenerator,采用流式 API 設(shè)計,配置更加簡潔、直觀和強(qiáng)大 [2]。
2. 依賴準(zhǔn)備
MyBatis-Plus 代碼生成器從 3.0.3 版本后將核心生成器和模板引擎解耦,因此需要手動引入相關(guān)依賴。
2.1 核心生成器依賴
在 Maven 項目中,需要引入 mybatis-plus-generator 依賴。建議使用 3.5.1 及以上版本以獲得最新的 FastAutoGenerator 功能。
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.5.3.1</version> <!-- 請使用最新穩(wěn)定版本 -->
</dependency>2.2 模板引擎依賴
MyBatis-Plus 默認(rèn)使用 Velocity 模板引擎,但推薦使用更強(qiáng)大的 Freemarker 或 Beetl。以下以 Freemarker 為例:
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.31</version> <!-- 請使用最新穩(wěn)定版本 -->
</dependency>2.3 數(shù)據(jù)庫驅(qū)動
同時,還需要引入對應(yīng)數(shù)據(jù)庫的 JDBC 驅(qū)動(例如 MySQL Connector/J)。
3. 核心配置體系:FastAutoGenerator
MyBatis-Plus 推薦使用 FastAutoGenerator 類進(jìn)行配置,它通過流式 API 將配置過程劃分為四個主要步驟:數(shù)據(jù)源、全局配置、包配置和策略配置 [2]。
3.1 整體結(jié)構(gòu)
FastAutoGenerator.create(DATA_SOURCE_URL, USERNAME, PASSWORD)
.globalConfig(builder -> {
// 1. 全局配置 (GlobalConfig)
})
.packageConfig(builder -> {
// 2. 包配置 (PackageConfig)
})
.strategyConfig(builder -> {
// 3. 策略配置 (StrategyConfig)
})
.templateEngine(new FreemarkerTemplateEngine()) // 4. 模板引擎
.execute(); // 5. 執(zhí)行生成
3.2 關(guān)鍵配置項詳解
3.2.1 全局配置 (GlobalConfig)
用于設(shè)置生成代碼的作者、輸出目錄、是否覆蓋文件等全局屬性。
| 方法 | 描述 | 示例 |
|---|---|---|
| outputDir(String) | 設(shè)置代碼生成目錄的絕對路徑。 | builder.outputDir("D:/code_output"); |
| author(String) | 設(shè)置開發(fā)人員名稱,用于代碼注釋。 | builder.author("Manus AI"); |
| fileOverride() | 開啟文件覆蓋模式,謹(jǐn)慎使用。 | builder.fileOverride(); |
| enableSwagger() | 開啟 Swagger 注解支持。 | builder.enableSwagger(); |
| dateType(DateType) | 設(shè)置時間類型,如 DateType.ONLY_DATE。 | builder.dateType(DateType.TIME_PACK); |
3.2.2 包配置 (PackageConfig)
用于定義生成的代碼文件的包結(jié)構(gòu)。
| 方法 | 描述 | 示例 |
|---|---|---|
| parent(String) | 設(shè)置父包名。 | builder.parent("com.example.project"); |
| moduleName(String) | 設(shè)置模塊名,會在父包下創(chuàng)建子包。 | builder.moduleName("user"); |
| entity(String) | 設(shè)置實體類包名。 | builder.entity("model"); |
| mapper(String) | 設(shè)置 Mapper 接口包名。 | builder.mapper("dao"); |
| service(String) | 設(shè)置 Service 接口包名。 | builder.service("service"); |
| controller(String) | 設(shè)置 Controller 包名。 | builder.controller("web"); |
3.2.3 策略配置 (StrategyConfig)
用于定義數(shù)據(jù)庫表和字段的生成策略,是配置最復(fù)雜的部分。
| 方法 | 描述 | 示例 |
|---|---|---|
| addInclude(String...) | 必須:設(shè)置需要生成的表名。 | builder.addInclude("t_user", "t_order"); |
| addTablePrefix(String...) | 設(shè)置需要過濾的表前綴。 | builder.addTablePrefix("t_", "sys_"); |
| entityBuilder() | 實體類生成策略配置。 | builder.entityBuilder().enableLombok(); |
| mapperBuilder() | Mapper 接口生成策略配置。 | builder.mapperBuilder().enableMapperAnnotation(); |
| serviceBuilder() | Service 層生成策略配置。 | builder.serviceBuilder().formatServiceFileName("%sService"); |
| controllerBuilder() | Controller 層生成策略配置。 | builder.controllerBuilder().enableRestStyle(); |
4. 完整案例:Spring Boot 集成與代碼生成
本案例演示如何在 Spring Boot 項目中,使用 FastAutoGenerator 為 sys_user 表生成 Entity、Mapper、Service 和 Controller 代碼。
4.1 案例環(huán)境準(zhǔn)備
數(shù)據(jù)庫表結(jié)構(gòu):假設(shè) MySQL 中存在以下表:
CREATE TABLE `sys_user` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主鍵ID', `user_name` varchar(50) NOT NULL COMMENT '用戶名', `age` int DEFAULT NULL COMMENT '年齡', `email` varchar(100) DEFAULT NULL COMMENT '郵箱', `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '創(chuàng)建時間', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='系統(tǒng)用戶表';
項目結(jié)構(gòu):在 Spring Boot 項目的 src/test/java 或一個獨立的 generator 模塊中創(chuàng)建代碼生成器類。
4.2 代碼生成器實現(xiàn) (CodeGenerator.java)
我們使用 FastAutoGenerator 的流式 API,并配置 Lombok、Rest 風(fēng)格 Controller、以及下劃線轉(zhuǎn)駝峰命名策略。
package com.example.generator;
import com.baomidou.mybatisplus.annotation.IdType;
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 {
// 數(shù)據(jù)庫連接信息
private static final String URL = "jdbc:mysql://localhost:3306/test_db?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai";
private static final String USERNAME = "root";
private static final String PASSWORD = "your_password";
private static final String PARENT_PACKAGE = "com.example.demo";
private static final String MODULE_NAME = "system";
private static final String AUTHOR = "Manus AI";
public static void main(String[] args) {
FastAutoGenerator.create(URL, USERNAME, PASSWORD)
// 1. 全局配置
.globalConfig(builder -> {
builder.author(AUTHOR) // 設(shè)置作者
.enableSwagger() // 開啟 Swagger 模式
.fileOverride() // 覆蓋已生成文件
.outputDir(System.getProperty("user.dir") + "/src/main/java"); // 指定輸出目錄
})
// 2. 包配置
.packageConfig(builder -> {
builder.parent(PARENT_PACKAGE) // 設(shè)置父包名
.moduleName(MODULE_NAME) // 設(shè)置父包模塊名 (com.example.demo.system)
.pathInfo(Collections.singletonMap(OutputFile.xml,
System.getProperty("user.dir") + "/src/main/resources/mapper/" + MODULE_NAME)); // 設(shè)置 Mapper XML 輸出路徑
})
// 3. 策略配置
.strategyConfig(builder -> {
builder.addInclude("sys_user") // 設(shè)置需要生成的表名
.addTablePrefix("sys_") // 設(shè)置過濾表前綴
// 3.1 Entity 策略
.entityBuilder()
.enableLombok() // 開啟 Lombok
.enableChainModel() // 開啟鏈?zhǔn)侥P?
.idType(IdType.AUTO) // 設(shè)置主鍵生成策略
.columnNaming(com.baomidou.mybatisplus.generator.config.rules.NamingStrategy.underline_to_camel) // 字段名下劃線轉(zhuǎn)駝峰
// 3.2 Controller 策略
.controllerBuilder()
.enableRestStyle() // 開啟 @RestController
// 3.3 Service 策略
.serviceBuilder()
.formatServiceFileName("%sService") // 格式化 Service 接口文件名稱
// 3.4 Mapper 策略
.mapperBuilder()
.enableMapperAnnotation() // 開啟 @Mapper 注解
.enableBaseResultMap() // 啟用 BaseResultMap
.enableBaseColumnList(); // 啟用 BaseColumnList
})
// 4. 模板引擎配置 (使用 Freemarker)
.templateEngine(new FreemarkerTemplateEngine())
// 5. 執(zhí)行生成
.execute();
}
}
4.3 生成結(jié)果分析
執(zhí)行上述 main 方法后,代碼將生成到指定的輸出目錄,例如:
| 文件類型 | 路徑 | 描述 |
|---|---|---|
| Entity | com.example.demo.system.entity.User.java | 包含 id, userName, age, email, createTime 屬性,并帶有 Lombok 注解。 |
| Mapper | com.example.demo.system.mapper.UserMapper.java | 繼承自 BaseMapper<User>,包含基礎(chǔ) CRUD 方法。 |
| Mapper XML | src/main/resources/mapper/system/UserMapper.xml | 包含 BaseResultMap 和 BaseColumnList,以及基礎(chǔ) SQL 語句。 |
| Service | com.example.demo.system.service.UserService.java | 繼承自 IService<User>。 |
| Service Impl | com.example.demo.system.service.impl.UserServiceImpl.java | 繼承自 ServiceImpl<UserMapper, User>。 |
| Controller | com.example.demo.system.controller.UserController.java | 帶有 @RestController 注解,包含基礎(chǔ)的 RESTful 接口。 |
5. 高級特性與最佳實踐
5.1 自定義模板
如果默認(rèn)生成的代碼不符合您的項目規(guī)范(例如需要自定義注釋、引入特定的父類或接口),可以通過自定義模板來實現(xiàn)。
- 獲取默認(rèn)模板:從
mybatis-plus-generator的源碼中獲取默認(rèn)的模板文件(如entity.java.ftl)。 - 修改模板:將模板文件拷貝到項目的
src/main/resources/templates目錄下,并根據(jù)需求修改其中的內(nèi)容。 - 配置模板路徑:在
FastAutoGenerator中通過templateConfig指定自定義模板的路徑。
// 示例:配置自定義 Entity 模板
.templateConfig(builder -> {
builder.entity("templates/my_entity.java"); // 使用自定義模板
})
5.2 字段類型處理
MyBatis-Plus 提供了靈活的字段類型處理機(jī)制,例如將數(shù)據(jù)庫的 datetime 映射為 Java 8 的 LocalDateTime。
// 在 GlobalConfig 中設(shè)置時間類型策略
.globalConfig(builder -> {
// ... 其他配置
builder.dateType(com.baomidou.mybatisplus.generator.config.rules.DateType.TIME_PACK); // 映射為 LocalDateTime
})
5.3 排除公共字段
如果您的實體類繼承了一個包含公共字段(如 id, create_time, update_time)的基類 (BaseEntity),您可以在策略配置中排除這些字段,避免重復(fù)生成。
.strategyConfig(builder -> {
// ... 其他配置
builder.entityBuilder()
.superClass("com.example.BaseEntity") // 設(shè)置父類
.addSuperEntityColumns("id", "create_time", "update_time"); // 排除父類已有的字段
})
6. 結(jié)論
MyBatis-Plus 代碼生成器(AutoGenerator)是 Java 后端開發(fā)中不可多得的效率工具。通過掌握其 3.5.1+ 版本引入的 FastAutoGenerator 流式配置 API,開發(fā)者可以輕松實現(xiàn)代碼的自動化生成,將更多精力聚焦于核心業(yè)務(wù)邏輯的創(chuàng)新與實現(xiàn),從而顯著提升項目的開發(fā)速度和代碼質(zhì)量。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
從原理到最佳實踐詳解SpringBoot如何實現(xiàn)優(yōu)雅停機(jī)
優(yōu)雅停機(jī)在現(xiàn)代微服務(wù)架構(gòu)中是非常重要的,它幫助我們確保在應(yīng)用程序停止時,不會中斷正在進(jìn)行的請求或?qū)е聰?shù)據(jù)丟失,下面我們就來看看SpringBoot實現(xiàn)優(yōu)雅停機(jī)的具體方法吧2026-03-03
Spring Cloud Gateway替代zuul作為API網(wǎng)關(guān)的方法
本文簡要介紹如何使用Spring Cloud Gateway 作為API 網(wǎng)關(guān)(不是使用zuul作為網(wǎng)關(guān)),結(jié)合實例代碼給大家詳細(xì)講解,感興趣的朋友跟隨小編一起看看吧2023-02-02
java實現(xiàn)Img與PDF相互轉(zhuǎn)換
這篇文章主要為大家詳細(xì)介紹了java實現(xiàn)Img與PDF相互轉(zhuǎn)換的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-05-05
IDEA生成標(biāo)準(zhǔn)JavaBean的幾種方法總結(jié)
標(biāo)準(zhǔn)javaBean是定義一個類的標(biāo)準(zhǔn)結(jié)構(gòu),下面這篇文章主要給大家總結(jié)介紹了關(guān)于IDEA生成標(biāo)準(zhǔn)JavaBean的幾種方法,文中通過圖文以及代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-03-03
Java實現(xiàn)級聯(lián)下拉結(jié)構(gòu)的示例代碼
在開發(fā)過程中,會遇到很多的實體需要將查出的數(shù)據(jù)處理為下拉或者級聯(lián)下拉的結(jié)構(gòu),提供給前端進(jìn)行展示。本文為大家介紹了java封裝下拉和級聯(lián)下拉的通用工具類,需要的可以參考一下2022-06-06
解決Java壓縮zip異常java.util.zip.ZipException:duplicate entry
這篇文章主要介紹了解決Java壓縮zip異常java.util.zip.ZipException:duplicate entry:問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12
springboot使用mybatis一對多的關(guān)聯(lián)查詢問題記錄
這篇文章主要介紹了springboot使用mybatis一對多的關(guān)聯(lián)查詢問題記錄,剛好最近有個需求需要做到關(guān)聯(lián)的查詢,時間也算充足,所以用sql來寫,于是踩了很久坑,終于跳出來了,小小記錄一下2022-01-01

