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
文件中添加代码生成器所需的依赖:
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
的类,用于配置和执行代码生成操作。
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
文件中,配置数据库连接信息:
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
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 {
@Autowired
private 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
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 {
@Override
public 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
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
方法执行代码生成操作,代码生成器会根据配置信息生成相应的代码文件。