SpringBoot 集成MyBatis-Plus-Generator(最新版3.5.2版本)自动生成代码(附带集成MyBatis-Plus)

SpringBoot 集成MyBatis-Plus-Generator(最新版3.5.2版本)自动生成代码(附带集成MyBatis-Plus)

官方文档

  • 快速入门
  • 代码生成器配置(新)

示例项目技术栈

  • spring boot 2.3.12.RELEASE
  • mybatis 3.5.2
  • mybatis plus 3.5.2
  • mybatis plus generator 3.5.2
  • mysql 8.0.17
  • velocity 2.3
  • hutool 5.8.15
  • druid 1.2.8
  • lombok 自带

示例程序选择的技术目前各项技术的稳定版本。

前言

相信大家厌烦重复的造轮子过程,编写与数据库表对应的实体类,接着再进行创建各种层次的包(mapper,service,impl),而现在一款神器登场了,它就是:MpBatis-Plus的代码自动生成器。能够节约大部分时间,还能覆盖许多增删改查方法,加快我们的开发速度。

 项目源地址放在gitee仓库,想要源代码的读者也可以根据实际情况自取,对你有帮助的话不妨点个赞加个Star⭐吧

代码源地址PracticeCode: 练习

项目搭建

1. 创建表

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`  (
  `id` bigint(0) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES (1, 'yeye', '123');

SET FOREIGN_KEY_CHECKS = 1;

2. 创建spring Boot项目

创建Spring Boot项目,在pom.xml文件中引入如下依赖:

<properties>
  <java.version>1.8</java.version>
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  <spring-boot.version>2.3.12.RELEASE</spring-boot.version>
  <hutool.version>5.8.15</hutool.version>
  <mybatis-plus.version>3.5.2</mybatis-plus.version>
  <velocity.version>2.3</velocity.version>
  <mysql.version>8.0.17</mysql.version>
  <fastjson.version>2.0.5</fastjson.version>
  <druid.version>1.2.8</druid.version>
</properties>

<dependencies>
  <dependency>
    <groupId>***.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>${fastjson.version}</version>
  </dependency>

  <!-- https://mvnrepository.***/artifact/***.alibaba/druid-spring-boot-starter -->
  <dependency>
    <groupId>***.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>${druid.version}</version>
  </dependency>
  <!-- mysql驱动 -->
  <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>${mysql.version}</version>
    <scope>runtime</scope>
  </dependency>


  <!-- https://mvnrepository.***/artifact/***.hutool/hutool-all -->
  <dependency>
    <groupId>***.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>${hutool.version}</version>
  </dependency>

  <dependency>
    <groupId>***.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>${mybatis-plus.version}</version>
  </dependency>

  <dependency>
    <groupId>***.baomidou</groupId>
    <artifactId>mybatis-plus-generator</artifactId>
    <version>${mybatis-plus.version}</version>
  </dependency>

  <dependency>
    <groupId>org.apache.velocity</groupId>
    <artifactId>velocity-engine-core</artifactId>
    <version>${velocity.version}</version>
  </dependency>

  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
  </dependency>

  <dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
  </dependency>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
    <exclusions>
      <exclusion>
        <groupId>org.junit.vintage</groupId>
        <artifactId>junit-vintage-engine</artifactId>
      </exclusion>
    </exclusions>
  </dependency>
</dependencies>


MyBatis Plus Generator支持的模板引擎有Velocity、Beetl、FreeMarker,笔者这里选择的是MyBatis Plus Generator默认的模板引擎 — Velocity 2.3,选择不同的模板引擎导入不同的模板即可。

3. 创建代码生成器启动类

数据源配置和全局代码配置类

String password = "123456";
String username = "root";
String url = "jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai";
DataSourceConfig.Builder dataSourceConfig = new DataSourceConfig.Builder(url, username, password);
String finalProjectPath = System.getProperty("user.dir"); //当前项目根目录

// dataSourceConfig数据源
FastAutoGenerator.create(dataSourceConfig)
// 全局代码配置类
.globalConfig(builder -> {
    builder.author("yeye") // 设置作者
    .enableSwagger() // 开启 swagger 模式
    .fileOverride() // 覆盖已生成文件
    .disableOpenDir() //禁止打开输出目录
    .outputDir(finalProjectPath + "/src/main/java"); // 指定输出目录
})
// 包配置
.packageConfig(builder -> {
    ///
})
// 策略配置
.strategyConfig(builder -> {
    ///
})
// 自定义模版引擎
.injectionConfig(consumer -> {
    ///
})
// 选择模板引擎
.templateEngine(
    ///
)
// 执行
.execute();

包配置

FastAutoGenerator.create(dataSourceConfig)
// 全局代码配置类
.globalConfig(builder -> {
    //
})
// 包配置
.packageConfig(builder -> {
    builder.parent("***.yeye") // 设置父包名
    .entity("model") //设置entity包名
    .controller("web.controller")//设置controller包名
    .mapper("dao")//设置mapper包名
    .service("service")//设置service包名
    .serviceImpl("service.impl")//设置impl包名
    .other("other")//设置other包名
    .pathInfo(Collections.singletonMap(OutputFile.xml, finalProjectPath + "/src/main/resources/mapper")); // 设置mapperXml生成路径
})
// 策略配置
.strategyConfig(builder -> {
    ///
})
// 自定义模版引擎
.injectionConfig(consumer -> {
    ///
})
// 选择模板引擎
.templateEngine(
    ///
)
// 执行
.execute();

在包配置中,笔者配置了父包名,配置了mybatis mapper文件存储路径,配置 Entity 包名、Mapper 包名、Service 包名、Controller 包名的。

策略配置

// dataSourceConfig数据源
FastAutoGenerator.create(dataSourceConfig)
//
})
// 包配置
.packageConfig(builder -> {
    ///
})
// 策略配置
.strategyConfig(builder -> {

    if (!CollectionUtils.isEmpty(tableList)) {
        builder.addInclude(tableList);
    }

    builder.addTablePrefix("wms_");// 设置过滤表前缀

    builder.entityBuilder() // entity配置
    .enableRemoveIsPrefix()
    .enableTableFieldAnnotation()
    .enableLombok();

    builder.controllerBuilder() // controller配置
    .enableRestStyle();

    builder.serviceBuilder() // service配置
    .formatServiceFileName("%sService")
    .formatServiceImplFileName("%sServiceImpl")
    .fileOverride();

    builder.mapperBuilder() // mapper配置
    .enableBaseResultMap()
    .enableMapperAnnotation()
    .formatMapperFileName("%sDao")
    .formatXmlFileName("%sMapper")
    .enableBaseColumnList();
    if (isOverride) { // 覆写配置
        builder.entityBuilder() // entity配置
        .fileOverride();
        builder.controllerBuilder() // controller配置
        .fileOverride();
        builder.serviceBuilder() // service配置
        .fileOverride();
        builder.mapperBuilder() // mapper配置
        .fileOverride();
    }
})
// 自定义模版引擎
.injectionConfig(consumer -> {
    ///
})
// 选择模板引擎
.templateEngine(
    ///
)
// 执行
.execute();

在策略配置中,笔者配置了需要生成的表名、过滤表前缀、开启 Lombok、覆盖已生成文件、下划线转驼峰命、Service 接口文件及实现类的文件名以及是否覆写。

自定义模版引擎

// dataSourceConfig数据源
FastAutoGenerator.create(dataSourceConfig)
// 全局代码配置类
.globalConfig(builder -> {
    //
})
// 包配置
.packageConfig(builder -> {
    ///
})
// 策略配置
.strategyConfig(builder -> {
    ///
})
// 自定义模版引擎
.injectionConfig(consumer -> {
    Map<String, String> customFile = new HashMap<>();
    customFile.put("DTO.java", "/templates/entityDTO.java.ftl"); //自定义模版引擎
    consumer.customFile(customFile);
})
// 选择模板引擎
.templateEngine(
    ///
)
// 执行
.execute();

选择模板引擎

// dataSourceConfig数据源
FastAutoGenerator.create(dataSourceConfig)
// 全局代码配置类
//
})
// 包配置
.packageConfig(builder -> {
    ///
})
// 策略配置
.strategyConfig(builder -> {
    ///
})
// 自定义模版引擎
.injectionConfig(consumer -> {
    ///
})
// 选择模板引擎
.templateEngine(
new VelocityTemplateEngine()
)
// 执行
.execute();

4. 代码生成器启动类完整代码

完整的代码生成器启动类 CodeGenerator.java 内容如下:

package ***.yeye.util;


import ***.baomidou.mybatisplus.generator.FastAutoGenerator;
import ***.baomidou.mybatisplus.generator.config.DataSourceConfig;
import ***.baomidou.mybatisplus.generator.config.OutputFile;
import ***.baomidou.mybatisplus.generator.engine.VelocityTemplateEngine;
import org.springframework.util.CollectionUtils;

import java.util.*;

public class CodeGenerator {

  public static void main(String[] args) {
    String password = "123456";
    String username = "root";
    String url = "jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai";
    DataSourceConfig.Builder dataSourceConfig = new DataSourceConfig.Builder(url, username, password);

    //String finalProjectPath = System.getProperty("user.dir"); //当前项目根目录
    String finalProjectPath = Objects.requireNonNull(CodeGenerator.class.getClassLoader().getResource(""))
      .getPath().replace("/target/classes/", "");

    List<String> tableList = new ArrayList<>();
    tableList.add("user");    // 生成全部table注释add掉就好
    // 写死
    creteModel(dataSourceConfig, finalProjectPath, Boolean.TRUE, tableList);

    // 手动输入(互动式)
    createSingleModel(dataSourceConfig,finalProjectPath);
  }

  private static void creteModel(DataSourceConfig.Builder dataSourceConfig,
                                 String finalProjectPath,
                                 Boolean isOverride,
                                 List<String> tableList) {
    // dataSourceConfig数据源
    FastAutoGenerator.create(dataSourceConfig)
      // 全局代码配置类
      .globalConfig(builder -> {
        builder.author("yeye") // 设置作者
//          .enableSwagger() // 开启 swagger 模式
          .fileOverride() // 覆盖已生成文件
          .disableOpenDir() //禁止打开输出目录
          .outputDir(finalProjectPath + "/src/main/java"); // 指定输出目录
      })
      // 包配置
      .packageConfig(builder -> {
        builder.parent("***.yeye") // 设置父包名
          .entity("model") //设置entity包名
          .controller("web.controller")
          .mapper("dao")
          .service("service")
          .serviceImpl("service.impl")
          .other("other")
          .pathInfo(Collections.singletonMap(OutputFile.xml, finalProjectPath + "/src/main/resources/mapper")); // 设置mapperXml生成路径

      })
      // 策略配置
      .strategyConfig(builder -> {

        if (!CollectionUtils.isEmpty(tableList)) {
          builder.addInclude(tableList);
        }

        builder.addTablePrefix("wms_");// 设置过滤表前缀

        builder.entityBuilder() // entity配置
          .enableRemoveIsPrefix()
          .enableTableFieldAnnotation()
          .enableLombok();

        builder.controllerBuilder() // controller配置
          .enableRestStyle();

        builder.serviceBuilder() // service配置
          .formatServiceFileName("%sService")
          .formatServiceImplFileName("%sServiceImpl")
          .fileOverride();

        builder.mapperBuilder() // mapper配置
          .enableBaseResultMap()
          .enableMapperAnnotation()
          .formatMapperFileName("%sDao")
          .formatXmlFileName("%sMapper")
          .enableBaseColumnList();
        if (isOverride) {
          builder.entityBuilder() // entity配置
            .fileOverride();
          builder.controllerBuilder() // controller配置
            .fileOverride();
          builder.serviceBuilder() // service配置
            .fileOverride();
          builder.mapperBuilder() // mapper配置
            .fileOverride();
        }
      })
      // 自定义模版引擎
      .injectionConfig(consumer -> {
        Map<String, String> customFile = new HashMap<>();
        // DTO
//        customFile.put("DTO.java", "/templates/entityDTO.java.ftl"); //自定义模版引擎
        consumer.customFile(customFile);
      })
      // 选择模板引擎
      .templateEngine(new VelocityTemplateEngine())
      // 执行
      .execute();
  }

  private static void createSingleModel(DataSourceConfig.Builder dataSourceConfig, String finalProjectPath) {
    FastAutoGenerator.create(dataSourceConfig)
      // 全局配置
      .globalConfig((scanner, builder) ->
        builder.author(scanner.apply("请输入作者名称?"))
          .fileOverride()
          .outputDir(finalProjectPath + "/src/main/java"))
      // 包配置
      .packageConfig(builder -> {
        builder.parent("***.yeye") // 设置父包名
          .entity("model") //设置entity包名
          .other("dao") // 设置dto包名
          .pathInfo(Collections.singletonMap(OutputFile.xml, finalProjectPath + "/src/main/resources/mapper")); // 设置mapperXml生成路径

      })
      // 策略配置
      .strategyConfig((scanner, builder) -> builder.addInclude(getTables(scanner.apply("请输入表名,多个英文逗号分隔?所有输入 all")))
        .controllerBuilder().enableRestStyle()
        .entityBuilder().enableLombok()
        .mapperBuilder().enableBaseResultMap().enableBaseColumnList()
        .build())

      .execute();


  }

  // 处理 all 情况
  protected static List<String> getTables(String tables) {
    return "all".equals(tables) ? Collections.emptyList() : Arrays.asList(tables.split(","));
  }

}

注意:全局配置中的用于覆盖已生成文件的方法fileOverride在当前版本中已过时,官方文档中目前还未更新,笔者使用 Boolean isOverride控制是否覆写代码。

另外,本文提供了两种生成方式,一种是写死的代码生成,另外一种是交互式生成方式,可自行选择使用。

5. 项目结构效果图

MyBatis-Plus使用实例

增删改查及自定义查询示例

@RestController
@RequestMapping("/user")
public class UserController {

  @Autowired
  private UserService userService;

  @GetMapping("list")
  public R list() {
    return R.ok().put("data", userService.list());
  }
  @GetMapping("count")
  public R count() {
    return R.ok().put("data", userService.count());
  }

  @GetMapping("info")
  public R info(@PathVariable("id") Long id) {
    return R.ok().put("data", userService.getById(id));
  }

  @GetMapping("query")
  public R query(@PathVariable("name") Long name) {
    return R.ok().put("data", userService
                      .getOne(new LambdaQueryWrapper<User>().eq(User::getName,name)));
  }

  @GetMapping("delete")
  public R delete(@PathVariable("id") Long id) {
    return R.ok().put("data", userService.removeById(id));
  }
  @PostMapping("save")
  public R save(@RequestParam User user) {
    return R.ok().put("data", userService.save(user));
  }

  @PostMapping("saveBatch")
  public R saveBatch(@RequestParam User user) {
    return R.ok().put("data", userService.saveBatch((Collection<User>) user));
  }
}

后记

MyBatis Plus Generator 根据默认模板生成的代码是比较简单的,在实际的应用中需要根据自身需要编写自定义模板引擎代码模板,实现自己的定制代码生成,对于笔者来说基本够用,能够满足日常的增删改查操作。

项目源地址放在gitee仓库,想要源代码的读者也可以根据实际情况自取,对你有帮助的话不妨点个赞加个Star⭐吧

代码源地址PracticeCode: 练习

如果这篇【文章】有帮助到你,希望可以给笔者点个赞👍,创作不易,相比官方的陈述,我更喜欢用直接用代码示例解析每一个有用的知识点,感兴趣的也可以关注一下笔者,后续也会更新更多的内容,例如状态机和工作流的实践,都会在后续慢慢更新。

转载请说明出处内容投诉
CSS教程_站长资源网 » SpringBoot 集成MyBatis-Plus-Generator(最新版3.5.2版本)自动生成代码(附带集成MyBatis-Plus)

发表评论

欢迎 访客 发表评论

一个令你着迷的主题!

查看演示 官网购买