目录
一. MP代码生成器简介
二. 准备工作
2.1 建立数据库和表
2.1 创建项目
三. 编写工具类
3.1 创建类
3.2 定义数据库连接变量
3.3 定义单表代码生成函数
3.4 扩展为任意表自动生成代码
四. 测试代码生成器
4.1 测试单表生成 model 方法
代码生成器是 MyBatis-Plus 提供的一个非常实用的功能,可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等代码,极大地提高了开发效率。
我们从网上拉取的一些博主项目,特别是Spring Boot项目,很多就会集成 MyBatis-Plus 使用MyBatis-Plus 提供的代码生成器,对于单表增删改查的项目来说可以极大的提升开发效率。
不管什么样的项目,都肯定是需要和数据库打交道的,所我们先把数据库表建立完成。
建表 SQL 如下,需要的小伙伴们直接复制。
/*
Navicat Premium Data Transfer
Source Server : localhost
Source Server Type : MySQL
Source Server Version : 80031 (8.0.31)
Source Host : localhost:3306
Source Schema : vueblog
Target Server Type : MySQL
Target Server Version : 80031 (8.0.31)
File Encoding : 65001
Date: 09/01/2025 09:34:43
*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for m_blog
-- ----------------------------
DROP TABLE IF EXISTS `m_blog`;
CREATE TABLE `m_blog` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`user_id` bigint NOT NULL COMMENT '用户ID',
`title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '文章标题',
`description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '描述',
`content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '目录',
`created` datetime NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间',
`status` tinyint NULL DEFAULT NULL COMMENT '状态',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 15 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for m_user
-- ----------------------------
DROP TABLE IF EXISTS `m_user`;
CREATE TABLE `m_user` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`username` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT '用户名',
`avatar` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT '用户头像',
`email` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT '用户邮箱',
`password` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT '用户密码',
`status` int NOT NULL COMMENT '用户状态',
`created` datetime NULL DEFAULT NULL COMMENT '创建时间',
`last_login` datetime NULL DEFAULT NULL COMMENT '上次登录时间',
PRIMARY KEY (`id`) USING BTREE,
INDEX `UK_USERNAME`(`username` ASC) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;
想要使用 MyBatis-Plus,肯定要先创建一个 Spring Boot项目。然后,我们需要在 pom 文件中添加各种依赖,这里我说几个可以也推荐用的依赖包。如下所示,这两个插件在下面使用代码生成器时都会用到;
org.projectlombok
lombok
true
io.springfox
springfox-boot-starter
3.0.0
除了上面两个插件外,再加入 MyBatis-Plus 依赖和代码生成器依赖,如下
com.baomidou
mybatis-plus-boot-starter
3.5.3.1
com.baomidou
mybatis-plus-generator
3.5.3.1
public class FastCodeGenerator {
}
public class FastCodeGenerator {
// 定义数据库
public static final String MYSQL =
"jdbc:mysql://localhost:3306/vueblog? encrypt=false&trustServerCertificate=true&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true";
// 数据库用户名
public static final String USERNAME = "root";
// 数据库连接密码
public static final String PASSWORD = "123456";
}
public class FastCodeGenerator {
// 定义数据库
public static final String MYSQL =
"jdbc:mysql://localhost:3306/vueblog? encrypt=false&trustServerCertificate=true&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true";
// 数据库用户名
public static final String USERNAME = "root";
// 数据库连接密码
public static final String PASSWORD = "123456";
// 生成指定表代码,参数传递表名
public static void model(String tableName) {
// 配置数据源,三个参数在上面已经定义过了
FastAutoGenerator.create(MYSQL, USERNAME, PASSWORD)
// 全局配置
.globalConfig(builder -> {
// 设置作者,这里随便设置,改成自己即可
builder.author("ZhangSir")
// 开启 swagger 模式,加入swagger 依赖,在自动生成实体类时会根据数据库中的字段注释同步添加注释
.enableSwagger()
// 覆盖已生成文件
.fileOverride()
// 指定输出目录,这里同步改成自己的项目路径即可,即 盘符:/文件夹/文件夹/...文件夹/项目文件夹名称/src/main/java
.outputDir("D:/code/workspace/vueblog/vueblog-java/src/main/java");
})
// 包配置
.packageConfig(builder -> {
// 设置父包名,这里自定义,我取名叫 "com.markerhub"
builder.parent("com.markerhub")
// 设置XML生成路径,和上卖弄代码路径类似,mapper文件放置对应的 resource 文件夹中
.pathInfo(Collections.singletonMap(OutputFile.xml, "D:/code/workspace/vueblog/vueblog-java/src/main/resources/mapper"));
})
// 策略配置
.strategyConfig(builder -> {
// 设置需要生成的表名,有方法参数传递
builder.addInclude(tableName)
// 设置过滤表前缀,上面咱们定义的表都是 "m_"开头,如果以 "t_" 开头则对应修改即可,如果没有表前缀,不加此配置即可
.addTablePrefix("m_")
.entityBuilder()
// 主键策略,自增主键嘛,不必多说
.idType(IdType.AUTO)
// 使用 Lombok,就是前面加入的Lombok插件,生成的实体类会自动加入@Getter和@Setter方法,如果还需要toString和自动逸构造器,再自行添加即可
.enableLombok()
.mapperBuilder()
.enableBaseColumnList() // XML中生成基础列
.enableBaseResultMap() // XML中生成基础结果集
.serviceBuilder()
// 自定义 Service 文件名,即表名+Service作为业务接口类名
.formatServiceFileName("%sService")
// 自定义 Service 实现,即表名+ServiceImpl作为接口实现类名
.formatServiceImplFileName("%sServiceImpl") 类文件名
.controllerBuilder()
// 开启 RestController 风格,自动生成的Controller控制器类会添加@RestController注解
.enableRestStyle();
})
// 模板引擎
.templateEngine(new VelocityTemplateEngine()) // 使用 Velocity 模板引擎
.execute();
}
}
在实际开发过程中,我们不会一张表一张表的去生成代码,而是扫描整个库,或者针对某几个表,现在我们对上面的单表代码生成做优化,再写一个方法即可,如下所示;
public class FastCodeGenerator {
// 定义数据库
public static final String MYSQL =
"jdbc:mysql://localhost:3306/vueblog? encrypt=false&trustServerCertificate=true&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true";
// 数据库用户名
public static final String USERNAME = "root";
// 数据库连接密码
public static final String PASSWORD = "123456";
// 生成指定表代码,参数传递表名
public static void model(String tableName) {
// 配置数据源,三个参数在上面已经定义过了
FastAutoGenerator.create(MYSQL, USERNAME, PASSWORD)
// 全局配置
.globalConfig(builder -> {
// 设置作者,这里随便设置,改成自己即可
builder.author("ZhangSir")
// 开启 swagger 模式,加入swagger 依赖,在自动生成实体类时会根据数据库中的字段注释同步添加注释
.enableSwagger()
// 覆盖已生成文件
.fileOverride()
// 指定输出目录,这里同步改成自己的项目路径即可,即 盘符:/文件夹/文件夹/...文件夹/项目文件夹名称/src/main/java
.outputDir("D:/code/workspace/vueblog/vueblog-java/src/main/java");
})
// 包配置
.packageConfig(builder -> {
// 设置父包名,这里自定义,我取名叫 "com.markerhub"
builder.parent("com.markerhub")
// 设置XML生成路径,和上卖弄代码路径类似,mapper文件放置对应的 resource 文件夹中
.pathInfo(Collections.singletonMap(OutputFile.xml, "D:/code/workspace/vueblog/vueblog-java/src/main/resources/mapper"));
})
// 策略配置
.strategyConfig(builder -> {
// 设置需要生成的表名,有方法参数传递
builder.addInclude(tableName)
// 设置过滤表前缀,上面咱们定义的表都是 "m_"开头,如果以 "t_" 开头则对应修改即可,如果没有表前缀,不加此配置即可
.addTablePrefix("m_")
.entityBuilder()
// 主键策略,自增主键嘛,不必多说
.idType(IdType.AUTO)
// 使用 Lombok,就是前面加入的Lombok插件,生成的实体类会自动加入@Getter和@Setter方法,如果还需要toString和自动逸构造器,再自行添加即可
.enableLombok()
.mapperBuilder()
.enableBaseColumnList() // XML中生成基础列
.enableBaseResultMap() // XML中生成基础结果集
.serviceBuilder()
// 自定义 Service 文件名,即表名+Service作为业务接口类名
.formatServiceFileName("%sService")
// 自定义 Service 实现,即表名+ServiceImpl作为接口实现类名
.formatServiceImplFileName("%sServiceImpl") 类文件名
.controllerBuilder()
// 开启 RestController 风格,自动生成的Controller控制器类会添加@RestController注解
.enableRestStyle();
})
// 模板引擎
.templateEngine(new VelocityTemplateEngine()) // 使用 Velocity 模板引擎
.execute();
}
// 优化参数,变为可变参数,为空时扫描整个数据库,不为空时根据传递的参数去生成对应的代码
public static void generator(String... tableName){
// 定义数据库连接
Connection connection = null;
try {
// 获取数据库连接
connection = DriverManager.getConnection(MYSQL, USERNAME, PASSWORD);
// 获取数据库元数据
DatabaseMetaData metaData = connection.getMetaData();
ResultSet tables = metaData.getTables(null, null, "%", new String[]{"TABLE"});
// 循环可变参数生成整个数据库的代码,如果参数长度为0,说明没有人为传递表名,扫描整个数据库
if (tableName.length == 0) {
while (tables.next()) {
String table = tables.getString("TABLE_NAME");
model(table);
}
// 否则,参数长度不为0,说明人为传递了参数,因为是可变参数,管它传递了几个,直接增强for循环遍历挨个生成即可
} else{
for (String table : tableName){
model(table);
}
}
// 如果生成过程中报错,捕获异常
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
到了这一步,其实已经做完了,我们只需要创建一个 Main 方法,简单输入表名就可以测试了;
如下图,此时 entity,mapper,service包都是空的
然后调用 model 方法,传递参数 "m_user"用户表
方法运行成功,可以看到右侧各个包中都已经生成了对应的 User 表的实体类Entity,数据访问接口 UserMapper,业务接口及实现类,控制器UserController。
打开实体类User,可以看到,Swagger 和 Lombok 注解均已生效,生成了 @Getter 和 @Setter 方法,@ApiModelProperty 属性注解。
非常方便。
OK,关于MyBatis-Plus 代码生成器就讲到这里啦,内容不难,基本上自己动手建一个 Maven 项目跟着文章中的代码走一遍就会了。我们下篇文章再见啦!!!