在软件开发过程中,存在大量重复性的代码编写工作,例如实体类、Mapper 接口、Service 接口及实现类等。代码生成器就是为了解决这类问题而诞生的工具。MyBatis-Plus 代码生成器是 MyBatis-Plus 框架提供的一个实用工具,它能够根据数据库表结构自动生成实体类、Mapper 接口、Service 接口及实现类等代码,大大减少了开发者的手动编码工作量,提高了开发效率。
MyBatis-Plus 代码生成器的工作原理可以概括为以下几个关键步骤:
直接运行main方法去执行(官方文档中使用的一种方式)
创建一个 Spring Boot 项目。添加以下依赖:
在 pom.xml
文件中添加代码生成器所需的依赖:
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>com.baomidougroupId>
<artifactId>mybatis-plus-boot-starterartifactId>
<version>3.5.11version>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
dependency>
<dependency>
<groupId>com.baomidougroupId>
<artifactId>mybatis-plus-generatorartifactId>
<version>3.5.11version>
dependency>
<dependency>
<groupId>org.freemarkergroupId>
<artifactId>freemarkerartifactId>
<version>2.3.31version>
dependency>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<version>1.18.22version>
dependency>
dependencies>
创建一个名为 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();
}
}
直接在类中进行参数的修改,然后在 IDE 中运行 CodeGenerator.java
类的 main
方法,代码生成器会根据配置自动生成实体类、Mapper 接口、Service 接口及实现类、Controller 类和 Mapper XML 文件。
通过启动SpringBoot项目,然后通过postman等测试工具发送Post请求和参数去执行
和上面示例一致
在 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
创建一个 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 {
@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
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
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);
}
通过启动SpringBoot项目,然后通过postman等测试工具发送Post请求和参数去执行
以下是这些 @RequestParam
参数的含义及示例:
url
username
password
username
对应的密码,用于验证用户的身份,确保只有授权用户能够访问数据库。author
nomi-糯米
parentPackage
com.example.demo
tableNames
["user", "order"]
tablePrefix
tb_
以上两种方式可任选其一去使用
代码生成器目前支持两种生成方式:
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。execute
方法执行代码生成操作,代码生成器会根据配置信息生成相应的代码文件。