MyBatis-Plus代码生成器
MyBatis-Plus 代码生成器
MyBatis-Plus 提供了一个强大的 代码生成器,可以根据数据库表结构自动生成对应的实体类、Mapper 接口、Mapper XML 文件、Service 和 Controller 等代码。它极大地提高了开发效率,减少了手动编写基础代码的工作量。通过配置代码生成器,开发者可以快速生成项目中常用的 CRUD 代码,并且可以自定义生成策略,灵活调整生成的代码结构。
1. 什么是 MyBatis-Plus 代码生成器?
MyBatis-Plus 代码生成器基于模板引擎,可以自动生成以下内容:
- 实体类:对应数据库表的 Java 实体类。
- Mapper 接口:用于数据库访问的 Mapper 接口。
- Mapper XML:与 Mapper 接口对应的 SQL 映射文件(可选)。
- Service 和 ServiceImpl:业务逻辑层的接口和实现类。
- Controller:处理 HTTP 请求的控制层代码(可选)。
通过代码生成器,开发者只需要配置好数据库连接和表名等信息,即可自动生成一套基础的代码结构,节省大量重复性工作。
2. 引入代码生成器依赖
首先,在 pom.xml
中引入 MyBatis-Plus 代码生成器的依赖:
<dependencies><!-- MyBatis-Plus 代码生成器 --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>3.5.3</version></dependency><!-- 模板引擎(Freemarker 或 Velocity)--><dependency><groupId>org.apache.velocity</groupId><artifactId>velocity-engine-core</artifactId><version>2.3</version></dependency><!-- MySQL 驱动 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.31</version></dependency>
</dependencies>
mybatis-plus-generator
:MyBatis-Plus 代码生成器的核心依赖。velocity-engine-core
:使用 Velocity 作为模板引擎,也可以选择 Freemarker 等其他模板引擎。mysql-connector-java
:数据库驱动,具体数据库类型根据实际情况选择。
3. 基本代码生成器配置
MyBatis-Plus 代码生成器的核心配置通常通过 Java 代码实现,下面是一个简单的代码生成器配置示例。
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.VelocityTemplateEngine;public class CodeGenerator {public static void main(String[] args) {// 1. 创建代码生成器AutoGenerator generator = new AutoGenerator();// 2. 全局配置GlobalConfig globalConfig = new GlobalConfig();String projectPath = System.getProperty("user.dir"); // 项目路径globalConfig.setOutputDir(projectPath + "/src/main/java"); // 输出目录globalConfig.setAuthor("Your Name"); // 作者globalConfig.setOpen(false); // 生成后是否打开资源管理器globalConfig.setSwagger2(true); // 开启 Swagger2 注解globalConfig.setServiceName("%sService"); // 去掉 Service 接口的首字母 Igenerator.setGlobalConfig(globalConfig);// 3. 数据源配置DataSourceConfig dataSourceConfig = new DataSourceConfig();dataSourceConfig.setUrl("jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai");dataSourceConfig.setDriverName("com.mysql.cj.jdbc.Driver");dataSourceConfig.setUsername("root");dataSourceConfig.setPassword("yourpassword");dataSourceConfig.setDbType(DbType.MYSQL);generator.setDataSource(dataSourceConfig);// 4. 包配置PackageConfig packageConfig = new PackageConfig();packageConfig.setParent("com.example.demo"); // 父包名packageConfig.setModuleName("user"); // 模块名generator.setPackageInfo(packageConfig);// 5. 策略配置StrategyConfig strategyConfig = new StrategyConfig();strategyConfig.setNaming(NamingStrategy.underline_to_camel); // 表名生成策略strategyConfig.setColumnNaming(NamingStrategy.underline_to_camel); // 字段名生成策略strategyConfig.setEntityLombokModel(true); // 自动生成 Lombok 注解strategyConfig.setRestControllerStyle(true); // 生成 Rest 风格的 ControllerstrategyConfig.setInclude("user"); // 需要生成的表名(多个表可以使用逗号分隔)strategyConfig.setControllerMappingHyphenStyle(true); // URL 中驼峰转连字符generator.setStrategy(strategyConfig);// 6. 配置模板引擎generator.setTemplateEngine(new VelocityTemplateEngine());// 7. 执行生成操作generator.execute();}
}
在这个示例中,我们进行了以下配置:
-
全局配置 (
GlobalConfig
):- 设置代码生成的输出目录、作者信息。
- 指定是否生成 Swagger2 注解(适用于生成 REST API 文档)。
- 自定义 Service 接口的命名规则,去掉默认的
I
前缀。
-
数据源配置 (
DataSourceConfig
):- 配置数据库连接的 URL、驱动、用户名和密码。
-
包配置 (
PackageConfig
):- 设置生成代码的包结构,
parent
用于定义顶层包名,moduleName
定义模块名。
- 设置生成代码的包结构,
-
策略配置 (
StrategyConfig
):- 配置表和字段的命名规则(下划线转驼峰)。
- 生成 Lombok 注解,减少
getter
、setter
方法的编写。 - 配置生成的 Controller 使用 REST 风格。
-
模板引擎 (
VelocityTemplateEngine
):- 使用 Velocity 作为模板引擎,负责生成对应的代码文件。
4. 代码生成器的高级配置
MyBatis-Plus 的代码生成器非常灵活,支持多种自定义配置。下面介绍一些常见的高级配置选项。
4.1 自定义文件输出路径
可以通过 GlobalConfig.setOutputDir()
方法指定代码生成的输出路径。例如,将不同的文件生成到不同的目录下:
globalConfig.setOutputDir(projectPath + "/src/main/java"); // 默认输出到 src/main/java
4.2 忽略表前缀
在一些项目中,数据库表往往会有统一的前缀(如 t_
表示表),代码生成器可以忽略这些前缀,以便生成的实体类更符合命名规范:
strategyConfig.setTablePrefix("t_"); // 忽略表前缀 t_
4.3 实体类字段的自动填充
对于数据库中的 create_time
、update_time
等字段,通常需要在插入或更新时自动填充。MyBatis-Plus 代码生成器支持自动填充配置:
strategyConfig.setEntityTableFieldAnnotationEnable(true); // 开启实体类字段注解
并在实体类的字段上添加 @TableField
注解:
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
4.4 自定义模板路径
如果需要修改生成的代码模板,可以自定义模板路径。MyBatis-Plus 允许通过设置自定义模板路径来覆盖默认模板:
TemplateConfig templateConfig = new TemplateConfig();
templateConfig.setEntity("/templates/entity.java"); // 自定义实体类模板
generator.setTemplate(templateConfig);
自定义模板文件可以放置在 resources/templates
目录下,并根据需求修改内容。
4.5 生成 Controller、Service、Mapper 等代码
MyBatis-Plus 代码生成器可以生成包括实体类、Mapper 接口、Service 和 Controller 等多种代码。通过 PackageConfig
和 StrategyConfig
可以选择需要生成的代码类型。
packageConfig.setController("controller"); // Controller 包名
packageConfig.setService("service"); // Service 包名
packageConfig.setMapper("mapper"); // Mapper 包名
如果不想生成某些代码(如 XML 映射文件),可以通过禁用模板来实现:
java
TemplateConfig templateConfig = new TemplateConfig();
templateConfig.setXml(null); // 禁止生成 XML 映射文件
generator.setTemplate(templateConfig);
5. 代码生成后的目录结构
执行代码生成器后,MyBatis-Plus 会根据配置生成对应的代码文件,常见的目录结构如下:
src└── main└── java└── com└── example└── demo├── controller│ └── UserController.java├── entity│ └── User.java├── mapper│ └── UserMapper.java├── service│ ├── UserService.java│ └── impl│ └── UserServiceImpl.java└── xml└── UserMapper.xml
controller
:包含 REST 风格的控制层代码。entity
:实体类文件,映射数据库表。mapper
:Mapper 接口文件,定义了数据库操作的接口。service
和service.impl
:业务逻辑层代码。xml
:Mapper 对应的 XML 文件(如果开启 XML 生成)。
6. 自定义模板内容
如果想要根据自己的需求修改生成的代码结构或内容,可以通过自定义模板来实现。MyBatis-Plus 使用 Velocity 或 Freemarker 作为模板引擎,可以在 resources/templates
目录下编写自定义模板文件。
例如,自定义实体类模板:
#(entity)
package #if(${packageName})${packageName}.entity#end;import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;@Data
@TableName("${tableName}")
public class ${entityName} {#foreach($field in $fields)/*** ${field.comment}*/@TableIdprivate ${field.type} ${field.name};#end
}
然后在代码生成器配置中指定自定义模板路径:
TemplateConfig templateConfig = new TemplateConfig();
templateConfig.setEntity("/templates/custom_entity.java"); // 使用自定义的实体类模板
generator.setTemplate(templateConfig);
结论
MyBatis-Plus 的代码生成器是一个非常强大的工具,通过简单的配置,开发者可以快速生成项目所需的基础代码,包括实体类、Mapper、Service 和 Controller 等。它极大地提高了开发效率,特别适合数据模型复杂的项目。通过灵活的配置选项和模板自定义,开发者可以根据项目需求生成符合自己风格的代码结构,从而专注于业务逻辑的开发。