Mybatis-plus代碼生成器的創建使用與詳細解釋
一、代碼生成器概述
1. 定義(什么是代碼生成器)
在軟件開發過程中,存在大量重復性的代碼編寫工作,例如實體類、Mapper 接口、Service 接口及實現類等。代碼生成器就是為了解決這類問題而誕生的工具。MyBatis-Plus 代碼生成器是 MyBatis-Plus 框架提供的一個實用工具,它能夠根據數據庫表結構自動生成實體類、Mapper 接口、Service 接口及實現類等代碼,大大減少了開發者的手動編碼工作量,提高了開發效率。
2. 原理
MyBatis-Plus 代碼生成器的工作原理可以概括為以下幾個關鍵步驟:
- 數據庫連接與元數據獲取:借助 JDBC 技術連接到指定的數據庫,并且讀取數據庫中表的元數據信息,像表名、列名、數據類型等。
- 模板引擎加載:采用模板引擎(如 Freemarker、Velocity 等)加載預先定義好的代碼模板。這些模板規定了生成代碼的結構與格式。
- 數據填充與代碼生成:把從數據庫獲取的元數據信息填充到代碼模板里,通過模板引擎的渲染功能,生成具體的代碼文件。
- 文件輸出:將生成的代碼文件按照指定的目錄結構和命名規則輸出到項目中。
3. 作用
- 提升開發效率:在傳統開發模式下,開發者需要手動編寫大量的基礎代碼,這不僅耗時,還容易出錯。代碼生成器能夠自動生成這些代碼,極大地減少了開發時間,讓開發者可以將更多精力投入到業務邏輯的實現上。
- 保證代碼規范性:生成的代碼遵循統一的規范和風格,避免了因個人習慣不同而導致的代碼風格差異,提高了代碼的可讀性和可維護性。
- 降低錯誤率:手動編寫基礎代碼時,容易出現拼寫錯誤、語法錯誤等問題。代碼生成器能夠確保生成的代碼語法正確、結構完整,減少了潛在的錯誤。
二、Spring Boot 項目使用代碼生成器示例一
直接運行main方法去執行(官方文檔中使用的一種方式)
1. 項目搭建
創建一個 Spring Boot 項目。添加以下依賴:
- Spring Web:用于構建 Web 應用程序。
- mybatis-plus-boot-starter:集成 MyBatis-Plus 框架。
- MyBatis-Plus-generator 代碼生成器依賴 。
- MySQL Driver:用于連接 MySQL 數據庫。
- Freemarker 模板引擎依賴。
2. 添加代碼生成器依賴
在 pom.xml
文件中添加代碼生成器所需的依賴:
<dependencies><!-- Spring Web 依賴 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- MyBatis-Plus Boot Starter 依賴 --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.11</version></dependency><!-- MySQL 驅動依賴 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><!-- MyBatis-Plus 代碼生成器依賴 --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>3.5.11</version></dependency><!-- Freemarker 模板引擎依賴 --><dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.31</version></dependency><!--lombok--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.22</version></dependency>
</dependencies>
3.編寫代碼生成器類
創建一個名為 CodeGenerator.java
的類,用于配置和執行代碼生成操作。
package org.nomi.mybatisplusgenerator.util;import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import org.springframework.beans.factory.annotation.Value;import java.util.Collections;public class CodeGenerator {public static void main(String[] args) {// 數據庫連接信息,需要替換為實際的信息String url = "jdbc:mysql://localhost:3306/your_database_name?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT&useSSL=false";String username = "your_username";String password = "your_password";// 創建代碼生成器實例FastAutoGenerator.create(url, username, password)// 全局配置.globalConfig(builder -> {// 設置代碼作者builder.author("nomi-糯米")// 是否覆蓋已存在的文件.fileOverride()// 代碼輸出目錄.outputDir("src/main/java");})// 包配置.packageConfig(builder -> {// 設置父包名builder.parent("輸入項目的包名")// 設置模塊名.moduleName("")// 實體類包名.entity("entity")// Mapper 接口包名.mapper("mapper")// Service 接口包名.service("service")// Service 實現類包名.serviceImpl("service.impl")// Controller 類包名.controller("controller")// Mapper XML 文件輸出路徑.pathInfo(Collections.singletonMap(OutputFile.xml, "src/main/resources/mapper"));})// 策略配置.strategyConfig(builder -> {// 指定要生成代碼的表名,可以指定多個表builder.addInclude("your_table_name")// 過濾表前綴,生成的實體類名會去掉該前綴.addTablePrefix("tb_");// 實體類策略配置builder.entityBuilder()// 開啟 Lombok 注解支持.enableLombok();// Controller 類策略配置builder.controllerBuilder()// 開啟 Restful 風格.enableRestStyle();})// 模板引擎配置,使用 Freemarker 模板引擎.templateEngine(new FreemarkerTemplateEngine())// 執行代碼生成操作.execute();}
}
4. 運行代碼生成器
直接在類中進行參數的修改,然后在 IDE 中運行 CodeGenerator.java
類的 main
方法,代碼生成器會根據配置自動生成實體類、Mapper 接口、Service 接口及實現類、Controller 類和 Mapper XML 文件。
二、Spring Boot 項目使用代碼生成器示例二
通過啟動SpringBoot項目,然后通過postman等測試工具發送Post請求和參數去執行
1.項目搭建
和上面示例一致
2.數據庫配置
在 src/main/resources
目錄下的 application.properties
文件中,配置數據庫連接信息:
# 數據庫連接 URL
spring.datasource.url=jdbc:mysql://localhost:3306/your_database_name?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT
# 數據庫用戶名
spring.datasource.username=your_username
# 數據庫密碼
spring.datasource.password=your_password
# 數據庫驅動類
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
3.編寫代碼生成器類
創建一個 Spring Boot 控制器,將代碼生成邏輯封裝在服務層,然后在控制器中接收配置參數并調用服務層方法來觸發代碼生成。
CodeGeneratorController.java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;// 代碼生成控制器
@RestController
public class CodeGeneratorController {@Autowiredprivate CodeGeneratorService codeGeneratorService;// 處理 POST 請求,接收配置參數并觸發代碼生成@PostMapping("/generate-code")public String generateCode(@RequestParam String url,@RequestParam String username,@RequestParam String password,@RequestParam String author,@RequestParam String parentPackage,@RequestParam String[] tableNames,@RequestParam String tablePrefix) {try {// 調用服務層方法生成代碼codeGeneratorService.generateCode(url, username, password, author, parentPackage, tableNames, tablePrefix);return "代碼生成成功";} catch (Exception e) {e.printStackTrace();return "代碼生成失敗: " + e.getMessage();}}
}
CodeGeneratorServiceImpl.java
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import org.springframework.stereotype.Service;import java.util.Collections;// 代碼生成服務實現類
@Service
public class CodeGeneratorServiceImpl implements CodeGeneratorService {@Overridepublic void generateCode(String url, String username, String password, String author, String parentPackage, String[] tableNames, String tablePrefix) {FastAutoGenerator.create(url, username, password)// 全局配置.globalConfig(builder -> {// 設置代碼作者builder.author(author)// 是否覆蓋已存在的文件.fileOverride()// 代碼輸出目錄.outputDir("src/main/java");})// 包配置.packageConfig(builder -> {// 設置父包名builder.parent(parentPackage)// 設置模塊名.moduleName("")// 實體類包名.entity("entity")// Mapper 接口包名.mapper("mapper")// Service 接口包名.service("service")// Service 實現類包名.serviceImpl("service.impl")// Controller 類包名.controller("controller")// Mapper XML 文件輸出路徑.pathInfo(Collections.singletonMap(OutputFile.xml, "src/main/resources/mapper"));})// 策略配置.strategyConfig(builder -> {// 指定要生成代碼的表名,可以指定多個表builder.addInclude(tableNames)// 過濾表前綴,生成的實體類名會去掉該前綴.addTablePrefix(tablePrefix);// 實體類策略配置builder.entityBuilder()// 開啟 Lombok 注解支持.enableLombok();// Controller 類策略配置builder.controllerBuilder()// 開啟 Restful 風格.enableRestStyle();})// 模板引擎配置,使用 Freemarker 模板引擎.templateEngine(new FreemarkerTemplateEngine())// 執行代碼生成操作.execute();}
}
CodeGeneratorService.java
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 interface CodeGeneratorService {// 生成代碼的方法,接收配置參數void generateCode(String url, String username, String password, String author, String parentPackage, String[] tableNames, String tablePrefix);
}
4. 運行代碼生成器
通過啟動SpringBoot項目,然后通過postman等測試工具發送Post請求和參數去執行
以下是這些 @RequestParam
參數的含義及示例:
url
- 含義:該參數代表數據庫的連接 URL,它描述了如何連接到特定的數據庫。其中包含了數據庫的協議、主機地址、端口號、數據庫名稱以及一些連接配置信息。
- 示例:jdbc:mysql://localhost:3306/your_database_name?useUnicode=true&characterEncoding=UTF - 8&serverTimezone=GMT
username
- 含義:用于連接數據庫的用戶名,數據庫通過該用戶名對用戶進行身份驗證。
- 示例:root
password
- 含義:與
username
對應的密碼,用于驗證用戶的身份,確保只有授權用戶能夠訪問數據庫。 - 示例:your_password
author
- 含義:代碼生成器生成代碼時,會將該參數作為代碼作者的信息添加到生成的代碼文件注釋中,方便后續維護時識別代碼的編寫者。
- 示例:
nomi-糯米
parentPackage
- 含義:指定生成代碼的父包名,生成的實體類、Mapper 接口、Service 接口等代碼文件會按照這個父包名來組織包結構。
- 示例:
com.example.demo
tableNames
- 含義:這是一個字符串數組,用于指定要為哪些數據庫表生成代碼。代碼生成器會根據這些表的結構生成對應的實體類、Mapper 接口等代碼。(如果有多張表可以同時填寫多個)
- 示例:
["user", "order"]
tablePrefix
- 含義:數據庫表名可能存在一些通用的前綴,該參數用于指定這些前綴。代碼生成器在生成實體類名時,會去掉這些前綴,使生成的實體類名更簡潔。
- 示例:
tb_
以上兩種方式可任選其一去使用
三、代碼詳細解釋
代碼生成器目前支持兩種生成方式:
- DefaultQuery (元數據查詢)
- 優點: 根據通用接口讀取數據庫元數據相關信息,對數據庫通用性較好。
- 缺點: 依賴數據庫廠商驅動實現。
- 備注: 默認方式,部分類型處理可能不理想。
- SQLQuery (SQL查詢)
- 優點: 需要根據數據庫編寫對應表、主鍵、字段獲取等查詢語句。
- 缺點: 通用性不強,同數據庫廠商不同版本可能會存在兼容問題(例如,H2數據庫只支持1.X版本)。
- 備注: 后期不再維護。
- 數據庫連接信息:在
FastAutoGenerator.create
方法中傳入數據庫的連接 URL、用戶名和密碼,以便代碼生成器能夠連接到數據庫并獲取表結構信息。 - 全局配置:
author
:設置代碼生成的作者信息,方便后續代碼的維護和管理。fileOverride
:如果設置為true
,當生成的代碼文件已經存在時,會覆蓋原有文件;如果設置為false
,則不會覆蓋。outputDir
:指定生成的代碼文件的輸出目錄,這里設置為src/main/java
。
- 包配置:
parent
:設置生成代碼的父包名,所有生成的類都會位于該包下。moduleName
:設置模塊名,可根據項目實際情況進行配置,這里設置為空。entity
、mapper
、service
、serviceImpl
、controller
:分別設置實體類、Mapper 接口、Service 接口、Service 實現類和 Controller 類的包名。pathInfo
:設置 Mapper XML 文件的輸出路徑,這里將其輸出到src/main/resources/mapper
目錄下。
- 策略配置:
addInclude
:指定需要生成代碼的表名,可以同時指定多個表,用逗號分隔。addTablePrefix
:設置過濾表前綴,生成的實體類名會去掉該前綴。例如,如果表名為t_user
,設置前綴為t_
,則生成的實體類名會是User
。enableLombok
:開啟 Lombok 注解支持,生成的實體類會自動添加 Lombok 注解,如@Data
、@NoArgsConstructor
等,簡化代碼編寫。enableRestStyle
:開啟 Restful 風格,生成的 Controller 類會使用@RestController
注解,方便構建 RESTful API。
- 模板引擎配置:使用 Freemarker 模板引擎來生成代碼,Freemarker 是一個強大的模板引擎,能夠根據模板和數據生成動態內容。
- 執行代碼生成:調用
execute
方法執行代碼生成操作,代碼生成器會根據配置信息生成相應的代碼文件。