Mybatis-plus代码生成器的创建使用与详细解释

Mybatis-plus代码生成器的创建使用与详细解释

一、代码生成器概述

1. 定义(什么是代码生成器)

在软件开发过程中,存在大量重复性的代码编写工作,例如实体类、Mapper 接口、Service 接口及实现类等。代码生成器就是为了解决这类问题而诞生的工具。MyBatis-Plus 代码生成器是 MyBatis-Plus 框架提供的一个实用工具,它能够根据数据库表结构自动生成实体类、Mapper 接口、Service 接口及实现类等代码,大大减少了开发者的手动编码工作量,提高了开发效率。

2. 原理

MyBatis-Plus 代码生成器的工作原理可以概括为以下几个关键步骤:


(图片来源于网络)

  • 数据库连接与元数据获取:借助 JDBC 技术连接到指定的数据库,并且读取数据库中表的元数据信息,像表名、列名、数据类型等。
  • 模板引擎加载:采用模板引擎(如 Freemarker、Velocity 等)加载预先定义好的代码模板。这些模板规定了生成代码的结构与格式。
  • 数据填充与代码生成:把从数据库获取的元数据信息填充到代码模板里,通过模板引擎的渲染功能,生成具体的代码文件。
  • 文件输出:将生成的代码文件按照指定的目录结构和命名规则输出到项目中。

3. 作用

  • 提升开发效率:在传统开发模式下,开发者需要手动编写大量的基础代码,这不仅耗时,还容易出错。代码生成器能够自动生成这些代码,极大地减少了开发时间,让开发者可以将更多精力投入到业务逻辑的实现上。
  • 保证代码规范性:生成的代码遵循统一的规范和风格,避免了因个人习惯不同而导致的代码风格差异,提高了代码的可读性和可维护性。
  • 降低错误率:手动编写基础代码时,容易出现拼写错误、语法错误等问题。代码生成器能够确保生成的代码语法正确、结构完整,减少了潜在的错误。

二、Spring Boot 项目使用代码生成器示例一

直接运行main方法去执行(官方文档中使用的一种方式)

1. 项目搭建

创建一个 Spring Boot 项目。添加以下依赖:

  • Spring Web:用于构建 Web 应用程序。
  • mybatis-plus-boot-starter:集成 MyBatis-Plus 框架。
  • MyBatis-Plus-generator 代码生成器依赖 。
  • MySQL Driver:用于连接 MySQL 数据库。
  • Freemarker 模板引擎依赖。

2. 添加代码生成器依赖

pom.xml 文件中添加代码生成器所需的依赖:

xml 复制代码
<dependencies>
    <!-- Spring Web 依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- MyBatis-Plus Boot Starter 依赖 -->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.5.11</version>
    </dependency>
    <!-- MySQL 驱动依赖 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
    <!-- MyBatis-Plus 代码生成器依赖 -->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-generator</artifactId>
        <version>3.5.11</version>
    </dependency>
    <!-- Freemarker 模板引擎依赖 -->
    <dependency>
        <groupId>org.freemarker</groupId>
        <artifactId>freemarker</artifactId>
        <version>2.3.31</version>
    </dependency>
    <!--lombok-->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.22</version>
    </dependency>
</dependencies>

3.编写代码生成器类

创建一个名为 CodeGenerator.java 的类,用于配置和执行代码生成操作。

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();
    }
}

4. 运行代码生成器

直接在类中进行参数的修改,然后在 IDE 中运行 CodeGenerator.java 类的 main 方法,代码生成器会根据配置自动生成实体类、Mapper 接口、Service 接口及实现类、Controller 类和 Mapper XML 文件。

二、Spring Boot 项目使用代码生成器示例二

通过启动SpringBoot项目,然后通过postman等测试工具发送Post请求和参数去执行

1.项目搭建

和上面示例一致

2.数据库配置

src/main/resources 目录下的 application.properties 文件中,配置数据库连接信息:

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

3.编写代码生成器类

创建一个 Spring Boot 控制器,将代码生成逻辑封装在服务层,然后在控制器中接收配置参数并调用服务层方法来触发代码生成。

CodeGeneratorController.java

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

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

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);
}    

4. 运行代码生成器

通过启动SpringBoot项目,然后通过postman等测试工具发送Post请求和参数去执行

以下是这些 @RequestParam 参数的含义及示例:

url

  • 含义:该参数代表数据库的连接 URL,它描述了如何连接到特定的数据库。其中包含了数据库的协议、主机地址、端口号、数据库名称以及一些连接配置信息。
  • 示例:jdbc:mysql://localhost:3306/your_database_name?useUnicode=true&characterEncoding=UTF - 8&serverTimezone=GMT

username

  • 含义:用于连接数据库的用户名,数据库通过该用户名对用户进行身份验证。
  • 示例:root

password

  • 含义 :与 username 对应的密码,用于验证用户的身份,确保只有授权用户能够访问数据库。
  • 示例:your_password

author

  • 含义:代码生成器生成代码时,会将该参数作为代码作者的信息添加到生成的代码文件注释中,方便后续维护时识别代码的编写者。
  • 示例nomi-糯米

parentPackage

  • 含义:指定生成代码的父包名,生成的实体类、Mapper 接口、Service 接口等代码文件会按照这个父包名来组织包结构。
  • 示例com.example.demo

tableNames

  • 含义:这是一个字符串数组,用于指定要为哪些数据库表生成代码。代码生成器会根据这些表的结构生成对应的实体类、Mapper 接口等代码。(如果有多张表可以同时填写多个)
  • 示例["user", "order"]

tablePrefix

  • 含义:数据库表名可能存在一些通用的前缀,该参数用于指定这些前缀。代码生成器在生成实体类名时,会去掉这些前缀,使生成的实体类名更简洁。
  • 示例tb_

以上两种方式可任选其一去使用

三、代码详细解释

代码生成器目前支持两种生成方式:

  1. DefaultQuery (元数据查询)
    • 优点: 根据通用接口读取数据库元数据相关信息,对数据库通用性较好。
    • 缺点: 依赖数据库厂商驱动实现。
    • 备注: 默认方式,部分类型处理可能不理想。
  2. SQLQuery (SQL查询)
    • 优点: 需要根据数据库编写对应表、主键、字段获取等查询语句。
    • 缺点: 通用性不强,同数据库厂商不同版本可能会存在兼容问题(例如,H2数据库只支持1.X版本)。
    • 备注: 后期不再维护。
  • 数据库连接信息 :在 FastAutoGenerator.create 方法中传入数据库的连接 URL、用户名和密码,以便代码生成器能够连接到数据库并获取表结构信息。
  • 全局配置:
    • author:设置代码生成的作者信息,方便后续代码的维护和管理。
    • fileOverride:如果设置为 true,当生成的代码文件已经存在时,会覆盖原有文件;如果设置为 false,则不会覆盖。
    • outputDir:指定生成的代码文件的输出目录,这里设置为 src/main/java
  • 包配置:
    • parent:设置生成代码的父包名,所有生成的类都会位于该包下。
    • moduleName:设置模块名,可根据项目实际情况进行配置,这里设置为空。
    • entitymapperserviceserviceImplcontroller:分别设置实体类、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。
  • 模板引擎配置:使用 Freemarker 模板引擎来生成代码,Freemarker 是一个强大的模板引擎,能够根据模板和数据生成动态内容。
  • 执行代码生成 :调用 execute 方法执行代码生成操作,代码生成器会根据配置信息生成相应的代码文件。
相关推荐
左直拳1 小时前
mysql community 8.0.23升级到8.0.42再到8.4.5
数据库·mysql·升级·8.0.42·8.4.5
laimaxgg1 小时前
MySQL表的约束
数据库·mysql
ABCDEEE72 小时前
人事管理系统6
windows·sql·mybatis
我不是秋秋2 小时前
MongoDB 操作全解析:从部署到安全控制的详细指南(含 emoji 趣味总结)
数据库·mongodb
消失在人海中2 小时前
使用exdp 备份数据库
数据库·oracle
涛思数据(TDengine)3 小时前
时序数据库 TDengine × Perspective:你需要的可视化“加速器”
数据库·时序数据库·tdengine
傻小胖3 小时前
MongoDB的下载安装与启动
数据库·mongodb
深鱼~3 小时前
【Redis】缓存|缓存的更新策略|内存淘汰策略|缓存预热、缓存穿透、缓存雪崩和缓存击穿
数据库·redis·缓存
nicepainkiller3 小时前
redis高阶2 高性能
数据库·redis·缓存