MyBatis-Plus代码生成器(AutoGenerator)用法及说明
作者:Lisonseekpan
1. 引言:MyBatis-Plus 代码生成器概述
1.1 什么是 AutoGenerator?
MyBatis-Plus (MP) 代码生成器,即 AutoGenerator,是 MyBatis-Plus 框架提供的一款高效工具。它的核心功能是根据数据库表结构,一键生成项目所需的分层代码,包括:
- Entity (实体类/Model)
- Mapper (持久层接口)
- Mapper XML (映射文件)
- Service (业务层接口及其实现类)
- Controller (控制层)
AutoGenerator 极大地减少了开发者在项目初期或数据库表结构变更时编写大量重复的 CRUD 代码的工作量,是 MyBatis-Plus 提高开发效率的关键工具之一 [1]。
1.2 核心优势
相比于传统的手动编写或旧版代码生成器,MyBatis-Plus AutoGenerator 具有以下优势:
- 高度自动化:只需配置数据源和生成策略,即可完成全套代码生成。
- 配置灵活:支持通过链式 API 进行精细化配置,包括命名策略、包结构、字段处理等。
- 模板丰富:内置支持 Velocity、Freemarker、Beetl 等多种模板引擎,并允许用户完全自定义代码模板,以适应不同的项目规范。
- 现代 API:从 3.5.1 版本开始,引入了
FastAutoGenerator,采用流式 API 设计,配置更加简洁、直观和强大 [2]。
2. 依赖准备
MyBatis-Plus 代码生成器从 3.0.3 版本后将核心生成器和模板引擎解耦,因此需要手动引入相关依赖。
2.1 核心生成器依赖
在 Maven 项目中,需要引入 mybatis-plus-generator 依赖。建议使用 3.5.1 及以上版本以获得最新的 FastAutoGenerator 功能。
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.5.3.1</version> <!-- 请使用最新稳定版本 -->
</dependency>2.2 模板引擎依赖
MyBatis-Plus 默认使用 Velocity 模板引擎,但推荐使用更强大的 Freemarker 或 Beetl。以下以 Freemarker 为例:
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.31</version> <!-- 请使用最新稳定版本 -->
</dependency>2.3 数据库驱动
同时,还需要引入对应数据库的 JDBC 驱动(例如 MySQL Connector/J)。
3. 核心配置体系:FastAutoGenerator
MyBatis-Plus 推荐使用 FastAutoGenerator 类进行配置,它通过流式 API 将配置过程划分为四个主要步骤:数据源、全局配置、包配置和策略配置 [2]。
3.1 整体结构
FastAutoGenerator.create(DATA_SOURCE_URL, USERNAME, PASSWORD)
.globalConfig(builder -> {
// 1. 全局配置 (GlobalConfig)
})
.packageConfig(builder -> {
// 2. 包配置 (PackageConfig)
})
.strategyConfig(builder -> {
// 3. 策略配置 (StrategyConfig)
})
.templateEngine(new FreemarkerTemplateEngine()) // 4. 模板引擎
.execute(); // 5. 执行生成
3.2 关键配置项详解
3.2.1 全局配置 (GlobalConfig)
用于设置生成代码的作者、输出目录、是否覆盖文件等全局属性。
| 方法 | 描述 | 示例 |
|---|---|---|
| outputDir(String) | 设置代码生成目录的绝对路径。 | builder.outputDir("D:/code_output"); |
| author(String) | 设置开发人员名称,用于代码注释。 | builder.author("Manus AI"); |
| fileOverride() | 开启文件覆盖模式,谨慎使用。 | builder.fileOverride(); |
| enableSwagger() | 开启 Swagger 注解支持。 | builder.enableSwagger(); |
| dateType(DateType) | 设置时间类型,如 DateType.ONLY_DATE。 | builder.dateType(DateType.TIME_PACK); |
3.2.2 包配置 (PackageConfig)
用于定义生成的代码文件的包结构。
| 方法 | 描述 | 示例 |
|---|---|---|
| parent(String) | 设置父包名。 | builder.parent("com.example.project"); |
| moduleName(String) | 设置模块名,会在父包下创建子包。 | builder.moduleName("user"); |
| entity(String) | 设置实体类包名。 | builder.entity("model"); |
| mapper(String) | 设置 Mapper 接口包名。 | builder.mapper("dao"); |
| service(String) | 设置 Service 接口包名。 | builder.service("service"); |
| controller(String) | 设置 Controller 包名。 | builder.controller("web"); |
3.2.3 策略配置 (StrategyConfig)
用于定义数据库表和字段的生成策略,是配置最复杂的部分。
| 方法 | 描述 | 示例 |
|---|---|---|
| addInclude(String...) | 必须:设置需要生成的表名。 | builder.addInclude("t_user", "t_order"); |
| addTablePrefix(String...) | 设置需要过滤的表前缀。 | builder.addTablePrefix("t_", "sys_"); |
| entityBuilder() | 实体类生成策略配置。 | builder.entityBuilder().enableLombok(); |
| mapperBuilder() | Mapper 接口生成策略配置。 | builder.mapperBuilder().enableMapperAnnotation(); |
| serviceBuilder() | Service 层生成策略配置。 | builder.serviceBuilder().formatServiceFileName("%sService"); |
| controllerBuilder() | Controller 层生成策略配置。 | builder.controllerBuilder().enableRestStyle(); |
4. 完整案例:Spring Boot 集成与代码生成
本案例演示如何在 Spring Boot 项目中,使用 FastAutoGenerator 为 sys_user 表生成 Entity、Mapper、Service 和 Controller 代码。
4.1 案例环境准备
数据库表结构:假设 MySQL 中存在以下表:
CREATE TABLE `sys_user` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', `user_name` varchar(50) NOT NULL COMMENT '用户名', `age` int DEFAULT NULL COMMENT '年龄', `email` varchar(100) DEFAULT NULL COMMENT '邮箱', `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='系统用户表';
项目结构:在 Spring Boot 项目的 src/test/java 或一个独立的 generator 模块中创建代码生成器类。
4.2 代码生成器实现 (CodeGenerator.java)
我们使用 FastAutoGenerator 的流式 API,并配置 Lombok、Rest 风格 Controller、以及下划线转驼峰命名策略。
package com.example.generator;
import com.baomidou.mybatisplus.annotation.IdType;
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 class CodeGenerator {
// 数据库连接信息
private static final String URL = "jdbc:mysql://localhost:3306/test_db?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai";
private static final String USERNAME = "root";
private static final String PASSWORD = "your_password";
private static final String PARENT_PACKAGE = "com.example.demo";
private static final String MODULE_NAME = "system";
private static final String AUTHOR = "Manus AI";
public static void main(String[] args) {
FastAutoGenerator.create(URL, USERNAME, PASSWORD)
// 1. 全局配置
.globalConfig(builder -> {
builder.author(AUTHOR) // 设置作者
.enableSwagger() // 开启 Swagger 模式
.fileOverride() // 覆盖已生成文件
.outputDir(System.getProperty("user.dir") + "/src/main/java"); // 指定输出目录
})
// 2. 包配置
.packageConfig(builder -> {
builder.parent(PARENT_PACKAGE) // 设置父包名
.moduleName(MODULE_NAME) // 设置父包模块名 (com.example.demo.system)
.pathInfo(Collections.singletonMap(OutputFile.xml,
System.getProperty("user.dir") + "/src/main/resources/mapper/" + MODULE_NAME)); // 设置 Mapper XML 输出路径
})
// 3. 策略配置
.strategyConfig(builder -> {
builder.addInclude("sys_user") // 设置需要生成的表名
.addTablePrefix("sys_") // 设置过滤表前缀
// 3.1 Entity 策略
.entityBuilder()
.enableLombok() // 开启 Lombok
.enableChainModel() // 开启链式模型
.idType(IdType.AUTO) // 设置主键生成策略
.columnNaming(com.baomidou.mybatisplus.generator.config.rules.NamingStrategy.underline_to_camel) // 字段名下划线转驼峰
// 3.2 Controller 策略
.controllerBuilder()
.enableRestStyle() // 开启 @RestController
// 3.3 Service 策略
.serviceBuilder()
.formatServiceFileName("%sService") // 格式化 Service 接口文件名称
// 3.4 Mapper 策略
.mapperBuilder()
.enableMapperAnnotation() // 开启 @Mapper 注解
.enableBaseResultMap() // 启用 BaseResultMap
.enableBaseColumnList(); // 启用 BaseColumnList
})
// 4. 模板引擎配置 (使用 Freemarker)
.templateEngine(new FreemarkerTemplateEngine())
// 5. 执行生成
.execute();
}
}
4.3 生成结果分析
执行上述 main 方法后,代码将生成到指定的输出目录,例如:
| 文件类型 | 路径 | 描述 |
|---|---|---|
| Entity | com.example.demo.system.entity.User.java | 包含 id, userName, age, email, createTime 属性,并带有 Lombok 注解。 |
| Mapper | com.example.demo.system.mapper.UserMapper.java | 继承自 BaseMapper<User>,包含基础 CRUD 方法。 |
| Mapper XML | src/main/resources/mapper/system/UserMapper.xml | 包含 BaseResultMap 和 BaseColumnList,以及基础 SQL 语句。 |
| Service | com.example.demo.system.service.UserService.java | 继承自 IService<User>。 |
| Service Impl | com.example.demo.system.service.impl.UserServiceImpl.java | 继承自 ServiceImpl<UserMapper, User>。 |
| Controller | com.example.demo.system.controller.UserController.java | 带有 @RestController 注解,包含基础的 RESTful 接口。 |
5. 高级特性与最佳实践
5.1 自定义模板
如果默认生成的代码不符合您的项目规范(例如需要自定义注释、引入特定的父类或接口),可以通过自定义模板来实现。
- 获取默认模板:从
mybatis-plus-generator的源码中获取默认的模板文件(如entity.java.ftl)。 - 修改模板:将模板文件拷贝到项目的
src/main/resources/templates目录下,并根据需求修改其中的内容。 - 配置模板路径:在
FastAutoGenerator中通过templateConfig指定自定义模板的路径。
// 示例:配置自定义 Entity 模板
.templateConfig(builder -> {
builder.entity("templates/my_entity.java"); // 使用自定义模板
})
5.2 字段类型处理
MyBatis-Plus 提供了灵活的字段类型处理机制,例如将数据库的 datetime 映射为 Java 8 的 LocalDateTime。
// 在 GlobalConfig 中设置时间类型策略
.globalConfig(builder -> {
// ... 其他配置
builder.dateType(com.baomidou.mybatisplus.generator.config.rules.DateType.TIME_PACK); // 映射为 LocalDateTime
})
5.3 排除公共字段
如果您的实体类继承了一个包含公共字段(如 id, create_time, update_time)的基类 (BaseEntity),您可以在策略配置中排除这些字段,避免重复生成。
.strategyConfig(builder -> {
// ... 其他配置
builder.entityBuilder()
.superClass("com.example.BaseEntity") // 设置父类
.addSuperEntityColumns("id", "create_time", "update_time"); // 排除父类已有的字段
})
6. 结论
MyBatis-Plus 代码生成器(AutoGenerator)是 Java 后端开发中不可多得的效率工具。通过掌握其 3.5.1+ 版本引入的 FastAutoGenerator 流式配置 API,开发者可以轻松实现代码的自动化生成,将更多精力聚焦于核心业务逻辑的创新与实现,从而显著提升项目的开发速度和代码质量。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
