MyBatisPlus 代码生成器如何使用?一篇文章学会它!!!

目录

一. MP代码生成器简介

二. 准备工作

2.1 建立数据库和表

2.1 创建项目

三. 编写工具类

3.1 创建类

3.2 定义数据库连接变量

3.3 定义单表代码生成函数

3.4 扩展为任意表自动生成代码

四. 测试代码生成器

4.1 测试单表生成 model 方法


一. MP代码生成器简介

代码生成器是 MyBatis-Plus 提供的一个非常实用的功能,可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等代码,极大地提高了开发效率。

我们从网上拉取的一些博主项目,特别是Spring Boot项目,很多就会集成 MyBatis-Plus 使用MyBatis-Plus 提供的代码生成器,对于单表增删改查的项目来说可以极大的提升开发效率。

二. 准备工作

2.1 建立数据库和表

不管什么样的项目,都肯定是需要和数据库打交道的,所我们先把数据库表建立完成。

建表 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;
2.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

三. 编写工具类

3.1 创建类
public class FastCodeGenerator {
}
3.2 定义数据库连接变量
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";
}
3.3 定义单表代码生成函数
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();
    }
}


3.4 扩展为任意表自动生成代码

在实际开发过程中,我们不会一张表一张表的去生成代码,而是扫描整个库,或者针对某几个表,现在我们对上面的单表代码生成做优化,再写一个方法即可,如下所示;

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 方法,简单输入表名就可以测试了;

4.1 测试单表生成 model 方法

如下图,此时 entity,mapper,service包都是空的

MyBatisPlus 代码生成器如何使用?一篇文章学会它!!!_第1张图片

然后调用 model 方法,传递参数 "m_user"用户表

MyBatisPlus 代码生成器如何使用?一篇文章学会它!!!_第2张图片

方法运行成功,可以看到右侧各个包中都已经生成了对应的 User 表的实体类Entity,数据访问接口 UserMapper,业务接口及实现类,控制器UserController。

打开实体类User,可以看到,Swagger 和 Lombok 注解均已生效,生成了 @Getter 和 @Setter 方法,@ApiModelProperty 属性注解。

非常方便。

MyBatisPlus 代码生成器如何使用?一篇文章学会它!!!_第3张图片

OK,关于MyBatis-Plus 代码生成器就讲到这里啦,内容不难,基本上自己动手建一个 Maven 项目跟着文章中的代码走一遍就会了。我们下篇文章再见啦!!!

你可能感兴趣的:(Java,数据库,#,MyBatis,java,spring,数据库)