当前位置:   article > 正文

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

mybatis-plus-generator

官方文档

示例项目技术栈

  • 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. 创建表

  1. SET NAMES utf8mb4;
  2. SET FOREIGN_KEY_CHECKS = 0;
  3. -- ----------------------------
  4. -- Table structure for user
  5. -- ----------------------------
  6. DROP TABLE IF EXISTS `user`;
  7. CREATE TABLE `user` (
  8. `id` bigint(0) NOT NULL AUTO_INCREMENT,
  9. `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  10. `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  11. PRIMARY KEY (`id`) USING BTREE
  12. ) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
  13. -- ----------------------------
  14. -- Records of user
  15. -- ----------------------------
  16. INSERT INTO `user` VALUES (1, 'yeye', '123');
  17. SET FOREIGN_KEY_CHECKS = 1;

2. 创建Spring Boot项目

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

  1. <properties>
  2. <java.version>1.8</java.version>
  3. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  4. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  5. <spring-boot.version>2.3.12.RELEASE</spring-boot.version>
  6. <hutool.version>5.8.15</hutool.version>
  7. <mybatis-plus.version>3.5.2</mybatis-plus.version>
  8. <velocity.version>2.3</velocity.version>
  9. <mysql.version>8.0.17</mysql.version>
  10. <fastjson.version>2.0.5</fastjson.version>
  11. <druid.version>1.2.8</druid.version>
  12. </properties>
  13. <dependencies>
  14. <dependency>
  15. <groupId>com.alibaba</groupId>
  16. <artifactId>fastjson</artifactId>
  17. <version>${fastjson.version}</version>
  18. </dependency>
  19. <!-- https://mvnrepository.com/artifact/com.alibaba/druid-spring-boot-starter -->
  20. <dependency>
  21. <groupId>com.alibaba</groupId>
  22. <artifactId>druid-spring-boot-starter</artifactId>
  23. <version>${druid.version}</version>
  24. </dependency>
  25. <!-- mysql驱动 -->
  26. <dependency>
  27. <groupId>mysql</groupId>
  28. <artifactId>mysql-connector-java</artifactId>
  29. <version>${mysql.version}</version>
  30. <scope>runtime</scope>
  31. </dependency>
  32. <!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all -->
  33. <dependency>
  34. <groupId>cn.hutool</groupId>
  35. <artifactId>hutool-all</artifactId>
  36. <version>${hutool.version}</version>
  37. </dependency>
  38. <dependency>
  39. <groupId>com.baomidou</groupId>
  40. <artifactId>mybatis-plus-boot-starter</artifactId>
  41. <version>${mybatis-plus.version}</version>
  42. </dependency>
  43. <dependency>
  44. <groupId>com.baomidou</groupId>
  45. <artifactId>mybatis-plus-generator</artifactId>
  46. <version>${mybatis-plus.version}</version>
  47. </dependency>
  48. <dependency>
  49. <groupId>org.apache.velocity</groupId>
  50. <artifactId>velocity-engine-core</artifactId>
  51. <version>${velocity.version}</version>
  52. </dependency>
  53. <dependency>
  54. <groupId>org.springframework.boot</groupId>
  55. <artifactId>spring-boot-starter-web</artifactId>
  56. </dependency>
  57. <dependency>
  58. <groupId>org.projectlombok</groupId>
  59. <artifactId>lombok</artifactId>
  60. <optional>true</optional>
  61. </dependency>
  62. <dependency>
  63. <groupId>org.springframework.boot</groupId>
  64. <artifactId>spring-boot-starter-test</artifactId>
  65. <scope>test</scope>
  66. <exclusions>
  67. <exclusion>
  68. <groupId>org.junit.vintage</groupId>
  69. <artifactId>junit-vintage-engine</artifactId>
  70. </exclusion>
  71. </exclusions>
  72. </dependency>
  73. </dependencies>


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

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

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

  1. String password = "123456";
  2. String username = "root";
  3. String url = "jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai";
  4. DataSourceConfig.Builder dataSourceConfig = new DataSourceConfig.Builder(url, username, password);
  5. String finalProjectPath = System.getProperty("user.dir"); //当前项目根目录
  6. // dataSourceConfig数据源
  7. FastAutoGenerator.create(dataSourceConfig)
  8. // 全局代码配置类
  9. .globalConfig(builder -> {
  10. builder.author("yeye") // 设置作者
  11. .enableSwagger() // 开启 swagger 模式
  12. .fileOverride() // 覆盖已生成文件
  13. .disableOpenDir() //禁止打开输出目录
  14. .outputDir(finalProjectPath + "/src/main/java"); // 指定输出目录
  15. })
  16. // 包配置
  17. .packageConfig(builder -> {
  18. ///
  19. })
  20. // 策略配置
  21. .strategyConfig(builder -> {
  22. ///
  23. })
  24. // 自定义模版引擎
  25. .injectionConfig(consumer -> {
  26. ///
  27. })
  28. // 选择模板引擎
  29. .templateEngine(
  30. ///
  31. )
  32. // 执行
  33. .execute();

包配置

  1. FastAutoGenerator.create(dataSourceConfig)
  2. // 全局代码配置类
  3. .globalConfig(builder -> {
  4. //
  5. })
  6. // 包配置
  7. .packageConfig(builder -> {
  8. builder.parent("com.yeye") // 设置父包名
  9. .entity("model") //设置entity包名
  10. .controller("web.controller")//设置controller包名
  11. .mapper("dao")//设置mapper包名
  12. .service("service")//设置service包名
  13. .serviceImpl("service.impl")//设置impl包名
  14. .other("other")//设置other包名
  15. .pathInfo(Collections.singletonMap(OutputFile.xml, finalProjectPath + "/src/main/resources/mapper")); // 设置mapperXml生成路径
  16. })
  17. // 策略配置
  18. .strategyConfig(builder -> {
  19. ///
  20. })
  21. // 自定义模版引擎
  22. .injectionConfig(consumer -> {
  23. ///
  24. })
  25. // 选择模板引擎
  26. .templateEngine(
  27. ///
  28. )
  29. // 执行
  30. .execute();

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

策略配置

  1. // dataSourceConfig数据源
  2. FastAutoGenerator.create(dataSourceConfig)
  3. //
  4. })
  5. // 包配置
  6. .packageConfig(builder -> {
  7. ///
  8. })
  9. // 策略配置
  10. .strategyConfig(builder -> {
  11. if (!CollectionUtils.isEmpty(tableList)) {
  12. builder.addInclude(tableList);
  13. }
  14. builder.addTablePrefix("wms_");// 设置过滤表前缀
  15. builder.entityBuilder() // entity配置
  16. .enableRemoveIsPrefix()
  17. .enableTableFieldAnnotation()
  18. .enableLombok();
  19. builder.controllerBuilder() // controller配置
  20. .enableRestStyle();
  21. builder.serviceBuilder() // service配置
  22. .formatServiceFileName("%sService")
  23. .formatServiceImplFileName("%sServiceImpl")
  24. .fileOverride();
  25. builder.mapperBuilder() // mapper配置
  26. .enableBaseResultMap()
  27. .enableMapperAnnotation()
  28. .formatMapperFileName("%sDao")
  29. .formatXmlFileName("%sMapper")
  30. .enableBaseColumnList();
  31. if (isOverride) { // 覆写配置
  32. builder.entityBuilder() // entity配置
  33. .fileOverride();
  34. builder.controllerBuilder() // controller配置
  35. .fileOverride();
  36. builder.serviceBuilder() // service配置
  37. .fileOverride();
  38. builder.mapperBuilder() // mapper配置
  39. .fileOverride();
  40. }
  41. })
  42. // 自定义模版引擎
  43. .injectionConfig(consumer -> {
  44. ///
  45. })
  46. // 选择模板引擎
  47. .templateEngine(
  48. ///
  49. )
  50. // 执行
  51. .execute();

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

自定义模版引擎

  1. // dataSourceConfig数据源
  2. FastAutoGenerator.create(dataSourceConfig)
  3. // 全局代码配置类
  4. .globalConfig(builder -> {
  5. //
  6. })
  7. // 包配置
  8. .packageConfig(builder -> {
  9. ///
  10. })
  11. // 策略配置
  12. .strategyConfig(builder -> {
  13. ///
  14. })
  15. // 自定义模版引擎
  16. .injectionConfig(consumer -> {
  17. Map<String, String> customFile = new HashMap<>();
  18. customFile.put("DTO.java", "/templates/entityDTO.java.ftl"); //自定义模版引擎
  19. consumer.customFile(customFile);
  20. })
  21. // 选择模板引擎
  22. .templateEngine(
  23. ///
  24. )
  25. // 执行
  26. .execute();

选择模板引擎

  1. // dataSourceConfig数据源
  2. FastAutoGenerator.create(dataSourceConfig)
  3. // 全局代码配置类
  4. //
  5. })
  6. // 包配置
  7. .packageConfig(builder -> {
  8. ///
  9. })
  10. // 策略配置
  11. .strategyConfig(builder -> {
  12. ///
  13. })
  14. // 自定义模版引擎
  15. .injectionConfig(consumer -> {
  16. ///
  17. })
  18. // 选择模板引擎
  19. .templateEngine(
  20. new VelocityTemplateEngine()
  21. )
  22. // 执行
  23. .execute();

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

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

  1. package com.yeye.util;
  2. import com.baomidou.mybatisplus.generator.FastAutoGenerator;
  3. import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
  4. import com.baomidou.mybatisplus.generator.config.OutputFile;
  5. import com.baomidou.mybatisplus.generator.engine.VelocityTemplateEngine;
  6. import org.springframework.util.CollectionUtils;
  7. import java.util.*;
  8. public class CodeGenerator {
  9. public static void main(String[] args) {
  10. String password = "123456";
  11. String username = "root";
  12. String url = "jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai";
  13. DataSourceConfig.Builder dataSourceConfig = new DataSourceConfig.Builder(url, username, password);
  14. //String finalProjectPath = System.getProperty("user.dir"); //当前项目根目录
  15. String finalProjectPath = Objects.requireNonNull(CodeGenerator.class.getClassLoader().getResource(""))
  16. .getPath().replace("/target/classes/", "");
  17. List<String> tableList = new ArrayList<>();
  18. tableList.add("user"); // 生成全部table注释add掉就好
  19. // 写死
  20. creteModel(dataSourceConfig, finalProjectPath, Boolean.TRUE, tableList);
  21. // 手动输入(互动式)
  22. createSingleModel(dataSourceConfig,finalProjectPath);
  23. }
  24. private static void creteModel(DataSourceConfig.Builder dataSourceConfig,
  25. String finalProjectPath,
  26. Boolean isOverride,
  27. List<String> tableList) {
  28. // dataSourceConfig数据源
  29. FastAutoGenerator.create(dataSourceConfig)
  30. // 全局代码配置类
  31. .globalConfig(builder -> {
  32. builder.author("yeye") // 设置作者
  33. // .enableSwagger() // 开启 swagger 模式
  34. .fileOverride() // 覆盖已生成文件
  35. .disableOpenDir() //禁止打开输出目录
  36. .outputDir(finalProjectPath + "/src/main/java"); // 指定输出目录
  37. })
  38. // 包配置
  39. .packageConfig(builder -> {
  40. builder.parent("com.yeye") // 设置父包名
  41. .entity("model") //设置entity包名
  42. .controller("web.controller")
  43. .mapper("dao")
  44. .service("service")
  45. .serviceImpl("service.impl")
  46. .other("other")
  47. .pathInfo(Collections.singletonMap(OutputFile.xml, finalProjectPath + "/src/main/resources/mapper")); // 设置mapperXml生成路径
  48. })
  49. // 策略配置
  50. .strategyConfig(builder -> {
  51. if (!CollectionUtils.isEmpty(tableList)) {
  52. builder.addInclude(tableList);
  53. }
  54. builder.addTablePrefix("wms_");// 设置过滤表前缀
  55. builder.entityBuilder() // entity配置
  56. .enableRemoveIsPrefix()
  57. .enableTableFieldAnnotation()
  58. .enableLombok();
  59. builder.controllerBuilder() // controller配置
  60. .enableRestStyle();
  61. builder.serviceBuilder() // service配置
  62. .formatServiceFileName("%sService")
  63. .formatServiceImplFileName("%sServiceImpl")
  64. .fileOverride();
  65. builder.mapperBuilder() // mapper配置
  66. .enableBaseResultMap()
  67. .enableMapperAnnotation()
  68. .formatMapperFileName("%sDao")
  69. .formatXmlFileName("%sMapper")
  70. .enableBaseColumnList();
  71. if (isOverride) {
  72. builder.entityBuilder() // entity配置
  73. .fileOverride();
  74. builder.controllerBuilder() // controller配置
  75. .fileOverride();
  76. builder.serviceBuilder() // service配置
  77. .fileOverride();
  78. builder.mapperBuilder() // mapper配置
  79. .fileOverride();
  80. }
  81. })
  82. // 自定义模版引擎
  83. .injectionConfig(consumer -> {
  84. Map<String, String> customFile = new HashMap<>();
  85. // DTO
  86. // customFile.put("DTO.java", "/templates/entityDTO.java.ftl"); //自定义模版引擎
  87. consumer.customFile(customFile);
  88. })
  89. // 选择模板引擎
  90. .templateEngine(new VelocityTemplateEngine())
  91. // 执行
  92. .execute();
  93. }
  94. private static void createSingleModel(DataSourceConfig.Builder dataSourceConfig, String finalProjectPath) {
  95. FastAutoGenerator.create(dataSourceConfig)
  96. // 全局配置
  97. .globalConfig((scanner, builder) ->
  98. builder.author(scanner.apply("请输入作者名称?"))
  99. .fileOverride()
  100. .outputDir(finalProjectPath + "/src/main/java"))
  101. // 包配置
  102. .packageConfig(builder -> {
  103. builder.parent("com.yeye") // 设置父包名
  104. .entity("model") //设置entity包名
  105. .other("dao") // 设置dto包名
  106. .pathInfo(Collections.singletonMap(OutputFile.xml, finalProjectPath + "/src/main/resources/mapper")); // 设置mapperXml生成路径
  107. })
  108. // 策略配置
  109. .strategyConfig((scanner, builder) -> builder.addInclude(getTables(scanner.apply("请输入表名,多个英文逗号分隔?所有输入 all")))
  110. .controllerBuilder().enableRestStyle()
  111. .entityBuilder().enableLombok()
  112. .mapperBuilder().enableBaseResultMap().enableBaseColumnList()
  113. .build())
  114. .execute();
  115. }
  116. // 处理 all 情况
  117. protected static List<String> getTables(String tables) {
  118. return "all".equals(tables) ? Collections.emptyList() : Arrays.asList(tables.split(","));
  119. }
  120. }

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

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

5. 项目结构效果图

MyBatis-Plus使用实例

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

  1. @RestController
  2. @RequestMapping("/user")
  3. public class UserController {
  4. @Autowired
  5. private UserService userService;
  6. @GetMapping("list")
  7. public R list() {
  8. return R.ok().put("data", userService.list());
  9. }
  10. @GetMapping("count")
  11. public R count() {
  12. return R.ok().put("data", userService.count());
  13. }
  14. @GetMapping("info")
  15. public R info(@PathVariable("id") Long id) {
  16. return R.ok().put("data", userService.getById(id));
  17. }
  18. @GetMapping("query")
  19. public R query(@PathVariable("name") Long name) {
  20. return R.ok().put("data", userService
  21. .getOne(new LambdaQueryWrapper<User>().eq(User::getName,name)));
  22. }
  23. @GetMapping("delete")
  24. public R delete(@PathVariable("id") Long id) {
  25. return R.ok().put("data", userService.removeById(id));
  26. }
  27. @PostMapping("save")
  28. public R save(@RequestParam User user) {
  29. return R.ok().put("data", userService.save(user));
  30. }
  31. @PostMapping("saveBatch")
  32. public R saveBatch(@RequestParam User user) {
  33. return R.ok().put("data", userService.saveBatch((Collection<User>) user));
  34. }
  35. }

后记

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

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

代码源地址PracticeCode: 练习

如果这篇【文章】有帮助到你,希望可以给笔者点个赞声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】

推荐阅读
相关标签