Mybatis-plus代碼生成器的創建使用與詳細解釋

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_

以上兩種方式可任選其一去使用

三、代碼詳細解釋

代碼生成器目前支持兩種生成方式:

  1. DefaultQuery (元數據查詢)
    • 優點: 根據通用接口讀取數據庫元數據相關信息,對數據庫通用性較好。
    • 缺點: 依賴數據庫廠商驅動實現。
    • 備注: 默認方式,部分類型處理可能不理想。
  2. SQLQuery (SQL查詢)
    • 優點: 需要根據數據庫編寫對應表、主鍵、字段獲取等查詢語句。
    • 缺點: 通用性不強,同數據庫廠商不同版本可能會存在兼容問題(例如,H2數據庫只支持1.X版本)。
    • 備注: 后期不再維護。
  • 數據庫連接信息:在 FastAutoGenerator.create 方法中傳入數據庫的連接 URL、用戶名和密碼,以便代碼生成器能夠連接到數據庫并獲取表結構信息。
  • 全局配置:
    • author:設置代碼生成的作者信息,方便后續代碼的維護和管理。
    • fileOverride:如果設置為 true,當生成的代碼文件已經存在時,會覆蓋原有文件;如果設置為 false,則不會覆蓋。
    • outputDir:指定生成的代碼文件的輸出目錄,這里設置為 src/main/java
  • 包配置:
    • parent:設置生成代碼的父包名,所有生成的類都會位于該包下。
    • moduleName:設置模塊名,可根據項目實際情況進行配置,這里設置為空。
    • entitymapperserviceserviceImplcontroller:分別設置實體類、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 方法執行代碼生成操作,代碼生成器會根據配置信息生成相應的代碼文件。

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

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

相關文章

drawDB:打造高效數據庫設計流程

drawDB&#xff1a;打造高效數據庫設計流程 drawDB 簡介資源鏈接 核心功能詳解1. 直觀的實體關系圖設計2. SQL 腳本生成3. SQL 導入功能4. 本地化存儲與分享功能5. 自定義主題與外觀 安裝和使用教程本地開發環境搭建構建生產版本Docker 部署基本使用方法 應用場景和實際價值適用…

基于 ESP32 和 GC9D01 0.71寸TFT屏幕的逼真眼睛與寫輪眼動態顯示

近期&#xff0c;我利用 ESP32 和 GC9D01 0.71’TFT 進行了一次有趣的顯示項目開發&#xff0c;成功實現了在該小尺寸屏幕上繪制逼真眼睛和寫輪眼的效果。 硬件準備 主控板 &#xff1a;ESP32&#xff0c;具備強大的處理能力和豐富的接口資源&#xff0c;能夠高效地處理圖像數…

LeetCode58_最后一個單詞的長度

LeetCode58_最后一個單詞的長度 標簽&#xff1a;#字符串Ⅰ. 題目Ⅱ. 示例 0. 個人方法 標簽&#xff1a;#字符串 Ⅰ. 題目 給你一個字符串 s&#xff0c;由若干單詞組成&#xff0c;單詞前后用一些空格字符隔開。返回字符串中 最后一個 單詞的長度。 單詞 是指僅由字母組成、…

論文閱讀:MAXIM Multi-Axis MLP for Image Processing

這是 2022 CVPR 上的一篇文章&#xff0c;介紹了用 MLP 做 low-level 圖像處理的工作 Abstract 近年來&#xff0c;Transformer 和多層感知機&#xff08;MLP&#xff09;模型的發展為計算機視覺任務提供了新的網絡架構設計。盡管這些模型在圖像識別等許多視覺任務中已被證明…

PostgreSQL初試

文章目錄 1 PostgreSQL 簡介2 PostgreSQL 與 MySQL 的區別3 PostgreSQL 的安裝1_Linux部署2_容器化部署 4 PostgreSQL的配置1_遠程連接配置2_配置數據庫的日志3_設置數據庫密碼 5 PostgreSQL 基本操作1_用戶操作2_權限操作3_創建一個自己的用戶4_差異補充 6 安裝圖形化界面1_使…

Fortran語言,do-end do循環,相互包含測試,自動性能優化

1&#xff09;上代碼 !$omp parallel private(n, j, dx, dy, dz, r, a)do n 1, nsteps!$omp dodo i 0, nparticles - 1x_tmp(i) x(i) vx(i) * dty_tmp(i) y(i) vy(i) * dtz_tmp(i) z(i) vz(i) * dtdo j 0, nparticles - 1dx x(j) - x(i)dy y(j) - y(i)dz z(j) - z(…

Cona編譯問題

問題描述 Clion 使用conan插件配置了C工程&#xff0c;然后想通過命令行進行編譯執行。 出現以下錯誤 CMake Error at /usr/local/Cellar/cmake/3.30.1/share/cmake/Modules/CMakeDetermineSystem.cmake:152 (message):Could not find toolchain file: conan_toolchain.cmake…

Qt實現 hello world + 內存泄漏(5)

文章目錄 實現hello world的兩種方式通過圖形化的方式通過純代碼的方式1. 新老頭文件的說明2.堆或棧上創建對象的選擇3.QString的說明 內存泄漏問題 實現hello world的兩種方式 通過圖形化的方式 通過圖形化的方式&#xff0c;在界面上創建出一個控件&#xff0c;顯示出hello …

【翻譯、轉載】【譯文】模型上下文協議(Model Context Protocol, MCP)簡介

原文地址&#xff1a; https://michaelwapp.medium.com/model-context-protocol-mcp-an-introduction-guide-25736f3dd672 在人工智能和 AI 驅動應用日新月異的格局中&#xff0c;一種與大型語言模型&#xff08;LLM&#xff09;交互的新方式正在興起。隨著 AI 智能體&#x…

[方法論]軟件工程中的軟件架構設計:從理論到實踐的深度解析

文章目錄 軟件架構設計&#xff1a;從理論到實踐的深度解析引言一、軟件架構設計的核心目標體系1.1 質量屬性矩陣1.2 架構權衡藝術 二、架構設計方法論演進2.1 傳統設計范式2.2 現代架構方法論2.3 設計模式演化路徑 三、主流架構風格全景圖3.1 單體架構&#xff08;Monolithic&…

【win11 】win11 鍵盤測試

我的鍵盤是支持mac和win的&#xff0c;fn tab 就能切換&#xff0c;有可能是用錯了模式&#xff0c;導致 我alt a 就會彈出 win11的 wifi 等菜單控制 鍵盤測試網站 https://keyboard.bmcx.com/ 識別到我按下的是alt

Linux環境部署iview-admin項目

環境&#xff1a;阿里云服務 系統&#xff1a;CentOS7.X系統 1、下載源碼安裝包 wget https://nodejs.org/dist/v14.17.3/node-v14.17.3-linux-x64.tar.xz2、解壓并放入指定目錄 tar -xf node-v14.17.3-linux-x64.tar.xz && mv node-v14.17.3-linux-x64 /usr/local/no…

VSCode常用插件推薦

文章目錄 VSCode常用插件推薦1 Git相關插件2 代碼格式3 AI工具4 語言插件通用工具參考 VSCode常用插件推薦 1 Git相關插件 2 代碼格式 3 AI工具 4 語言插件 通用工具 參考 50 個 VSCode 必裝插件推薦 https://mp.weixin.qq.com/s/b_OKvg3hdavtnv7pbWcKWg

【Unity】使用XLua進行熱修復

準備工作&#xff1a; &#xff08;1&#xff09;將XLua的Tool拖入Asset &#xff08;2&#xff09;配置熱修復 &#xff08;3&#xff09;運行Genrate Code &#xff08;4&#xff09;運行Hotfix Inject In Editor 編寫腳本&#xff08;注意類上帶有[Hotfix]&#xff09; [Hot…

javaEE——單例模式

目錄 前言1.概念2. 實現3. 比較和改進總結 前言 本篇文章來介紹單例模式&#xff0c;并講述在保證線程安全的前提下&#xff0c;單例模式的寫法。 1.概念 單例模式是一種設計模式&#xff0c;可以說是寫代碼的一種模板&#xff0c;如果在一些固定的場景下按照設計模式進行寫…

TS 對象類型

給對象添加類型注解 ![在這里插入圖片描述(https://i-blog.csdnimg.cn/direct/6c413992c11142d88106633ec442b905.png) 格式&#xff1a;數據類型名:類型別名 注意&#xff1a;對象類型限制使用分號&#xff0c;如果對象中存在方法就寫成&#xff1a;方法&#xff08;&#x…

C++類_虛基類

在 C 里&#xff0c;虛基類是用來解決菱形繼承問題的。菱形繼承問題是指當一個派生類從兩個或更多基類派生&#xff0c;而這些基類又從同一個基類派生時&#xff0c;派生類會包含多份間接基類的數據副本&#xff0c;這可能會引發數據冗余和二義性問題。虛基類可以保證在派生類中…

詳細案例,集成算法

以下是一個使用 隨機森林&#xff08;RF&#xff09; 和 XGBoost 解決結構化數據分類問題的完整案例&#xff08;以泰坦尼克號生存預測為例&#xff09;&#xff0c;包含數據處理、建模和結果分析&#xff1a; 案例&#xff1a;泰坦尼克號乘客生存預測 目標&#xff1a;根據乘客…

《C#數據結構與算法》—201線性表

線性表的實現方式 順序表 線性表的順序存儲是指在內存中用一塊地址連續的空間依次存放線性表的數據元素&#xff0c;用這種方式存儲的線性表叫順序表。 特點&#xff1a;表中相鄰的數據元素在內存中存儲位置也相鄰。 順序表接口實現&#xff1a; 方法名參數返回值描述GetLen…

深入解析C++11委托構造函數:消除冗余初始化的利器

一、傳統構造函數的痛點 在C11之前&#xff0c;當多個構造函數需要執行相同的初始化邏輯時&#xff0c;開發者往往面臨兩難選擇&#xff1a; class DataProcessor {std::string dataPath;bool verbose;int bufferSize; public:// 基礎版本DataProcessor(const std::string&am…