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.mzph.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…