1. 准备

准备两张表,用于测试

  1. CREATE TABLE `userT0` (
  2. `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  3. `name` varchar(20) NOT NULL DEFAULT '' COMMENT '用户名',
  4. `pwd` varchar(26) NOT NULL DEFAULT '' COMMENT '密码',
  5. `isDeleted` tinyint(1) NOT NULL DEFAULT '0',
  6. `created` varchar(13) NOT NULL DEFAULT '0',
  7. `updated` varchar(13) NOT NULL DEFAULT '0',
  8. PRIMARY KEY (`id`),
  9. KEY `name` (`name`)
  10. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
  11. CREATE TABLE `story_t0` (
  12. `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  13. `userId` int(20) unsigned NOT NULL DEFAULT '0' COMMENT '作者的userID',
  14. `name` varchar(20) NOT NULL DEFAULT '' COMMENT '作者名',
  15. `title` varchar(26) NOT NULL DEFAULT '' COMMENT '密码',
  16. `story` text COMMENT '故事内容',
  17. `is_deleted` tinyint(1) NOT NULL DEFAULT '0',
  18. `create_at` varchar(13) NOT NULL DEFAULT '0',
  19. `update_at` varchar(13) NOT NULL DEFAULT '0',
  20. `tag` int(11) DEFAULT NULL,
  21. PRIMARY KEY (`id`),
  22. KEY `userId` (`userId`)
  23. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

请注意,上面两张表的命名格式并不一样,有的是驼峰,有的是下划线(主要为了演示不同表名,对于生成代码的影响)

2. 配置依赖

首先需要在我们的xml文件中,添加相关的依赖

  1. <dependencies>
  2. <dependency>
  3. <groupId>com.baomidou</groupId>
  4. <artifactId>mybatis-plus-generator</artifactId>
  5. <version>3.3.1.tmp</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>org.freemarker</groupId>
  9. <artifactId>freemarker</artifactId>
  10. </dependency>
  11. <dependency>
  12. <groupId>mysql</groupId>
  13. <artifactId>mysql-connector-java</artifactId>
  14. </dependency>
  15. <!-- 下面两个,用于测试生成后的代码,在生成代码时,可以不需要-->
  16. <dependency>
  17. <groupId>org.springframework.boot</groupId>
  18. <artifactId>spring-boot-starter-web</artifactId>
  19. </dependency>
  20. <dependency>
  21. <groupId>com.baomidou</groupId>
  22. <artifactId>mybatis-plus-boot-starter</artifactId>
  23. <version>3.2.0</version>
  24. </dependency>
  25. </dependencies>

3. 代码生成类

写一个代码生成类方法,主要逻辑如下

  1. public class CodeGenerator {
  2. public static void main(String[] args) {
  3. // 代码生成器
  4. AutoGenerator mpg = new AutoGenerator();
  5. // 全局配置
  6. GlobalConfig gc = new GlobalConfig();
  7. String projectPath = System.getProperty("user.dir") + "/spring-boot/106-mybatis-plus-generator";
  8. gc.setOutputDir(projectPath + "/src/main/java");
  9. gc.setAuthor("ruangh");
  10. gc.setOpen(false);
  11. // 覆盖写
  12. gc.setFileOverride(false);
  13. mpg.setGlobalConfig(gc);
  14. // 数据源配置
  15. DataSourceConfig dsc = new DataSourceConfig();
  16. dsc.setUrl("jdbc:mysql://127.0.0.1:3306/story?useSSL=false&serverTimezone=UTC");
  17. // dsc.setSchemaName("public");
  18. dsc.setDriverName("com.mysql.jdbc.Driver");
  19. dsc.setUsername("root");
  20. dsc.setPassword("123456");
  21. mpg.setDataSource(dsc);
  22. // 包配置
  23. PackageConfig pc = new PackageConfig();
  24. // 不额外指定模块,如果指定为 test,则生成的xml会在 mapper/test/ 目录下
  25. pc.setModuleName("");
  26. pc.setParent("com.ruangh.mybatisplus.generator");
  27. mpg.setPackageInfo(pc);
  28. // 自定义配置
  29. InjectionConfig cfg = new InjectionConfig() {
  30. @Override
  31. public void initMap() {
  32. // to do nothing
  33. }
  34. };
  35. // 如果模板引擎是 freemarker
  36. String templatePath = "/templates/mapper.xml.ftl";
  37. // 自定义输出配置
  38. List<FileOutConfig> focList = new ArrayList<>();
  39. // 自定义配置会被优先输出
  40. focList.add(new FileOutConfig(templatePath) {
  41. @Override
  42. public String outputFile(TableInfo tableInfo) {
  43. // 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!!
  44. return projectPath + "/src/main/resources/mapper/" + pc.getModuleName() + "/" +
  45. tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
  46. }
  47. });
  48. cfg.setFileOutConfigList(focList);
  49. mpg.setCfg(cfg);
  50. // 配置模板
  51. TemplateConfig templateConfig = new TemplateConfig();
  52. templateConfig.setXml(null);
  53. // 不自动生成controller类
  54. templateConfig.setController(null);
  55. mpg.setTemplate(templateConfig);
  56. // 策略配置
  57. StrategyConfig strategy = new StrategyConfig();
  58. strategy.setNaming(NamingStrategy.underline_to_camel);
  59. strategy.setColumnNaming(NamingStrategy.underline_to_camel);
  60. // strategy.setSuperEntityClass("你自己的父类实体,没有就不用设置!");
  61. strategy.setEntityLombokModel(true);
  62. strategy.setRestControllerStyle(true);
  63. // 公共父类
  64. // strategy.setSuperControllerClass("你自己的父类控制器,没有就不用设置!");
  65. // 写于父类中的公共字段
  66. // strategy.setSuperEntityColumns("id");
  67. // 设置需要生成的表名
  68. strategy.setInclude("userT0", "story_t0");
  69. strategy.setControllerMappingHyphenStyle(true);
  70. // strategy.setTablePrefix(pc.getModuleName() + "_");
  71. mpg.setStrategy(strategy);
  72. mpg.setTemplateEngine(new FreemarkerTemplateEngine());
  73. mpg.execute();
  74. }
  75. }

上面的代码,绝大部分都是通用的,下面着重说明需要注意的点

  • GlobalConfig#setOutputDir: 设置代码输出的项目根路径,请根据具体的项目要求进行指定,不包含包名哦

  • : 设置为true,则每次生成都会覆盖之前生成的代码,适用于表结构发生变化的场景

    1. GlobalConfig#setFileOverride(true)
    • 注意:会导致之前添加的业务代码被覆盖掉,需要额外注意
    • 通常希望设置为false,当表结构发生变化时,手动介入
  • DataSourceConfig: 数据源的设置,上面设置的是mysql的相关配置

  • : 包信息

    1. PackageConfig
    • setParent: java包路径
    • setModuleName: 设置模块名,如设置为test,则xml在mapper/test/目录下; parent包自动加上.test
  • FileOutConfig: xml文件名

  • : 模板配置

    1. TemplateConfig
    • 可用默认的代码生成模板,也可以使用自定义的模板
    • 不想生成某个模板类时,设置为null即可(如上面的不生成controller)

  • : 策略配置

    1. StrategyConfig
    • 可以指定db->pojo字段名的映射规则
    • 可以指定POJO/Controller继承自定义的基类

在IDEA中,直接右键执行上面的代码,就会生成目标类,如下截图

2. Mybatis-Plus代码自动生成 - 图1

4. 输出测试

测试我们生成的类,是否可以对db进行操作,则有必要写一个启动类

  1. @RestController
  2. @SpringBootApplication
  3. @MapperScan("com.ruangh.mybatisplus.generator.mapper")
  4. public class Application {
  5. @Autowired
  6. private IUserT0Service userT0Service;
  7. @GetMapping
  8. public UserT0 hello(int id) {
  9. return userT0Service.getById(id);
  10. }
  11. public static void main(String[] args) {
  12. SpringApplication.run(Application.class);
  13. }
  14. }

请注意上面的@MapperScan注解,其次对应的application.yml配置文件内容如下

  1. spring:
  2. datasource:
  3. # 注意指定时区
  4. url: jdbc:mysql://127.0.0.1:3306/story?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
  5. username: root
  6. password:
  7. mybatis-plus:
  8. configuration:
  9. # 执行的sql语句日志输出
  10. log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

在db中插入一条数据

  1. INSERT INTO `userT0` (`id`, `name`, `pwd`, `isDeleted`, `created`, `updated`)
  2. VALUES
  3. true(1, '一灰灰', 'yihuihuiblog', 0, '2020-04-06 15', '2020-04-06 15');

访问url: http://localhost:8080/?id=1

控制台输出如下:

2. Mybatis-Plus代码自动生成 - 图2

5. 特殊场景说明

上面的代码生成,针对首次执行生成打码时,问题不大;但是后续的业务开发中,总会有一些其他的情况,下面分别说明

5.1 表结构修改

当表的结构发生变化时,我们需要一般需要重新生成对应的Entity,这个时候,需要GlobalConfig#setFileOverride(true)

5.2 继承公用POJO

我们可以定义一个通用的PO类,希望所有的表生成的POJO继承它

  1. @Data
  2. public class BasePo implements Serializable {
  3. private static final long serialVersionUID = -1136173266983480386L;
  4. @TableId(value = "id", type = IdType.AUTO)
  5. private Integer id;
  6. }

在代码自动生成类的策略配置中,添加下面的两行设置即可

  1. // 所有实体类继承自 BasePo, 且id在父类中
  2. StrategyConfig strategy = new StrategyConfig();
  3. strategy.setSuperEntityClass(BasePo.class);
  4. strategy.setSuperEntityColumns("id");

5.3 生成部分代码

有些时候,我并不希望生成service,xml,可能就只需要实体类 + mapper接口,这个时候可以设置TemplateConfig

  1. TemplateConfig templateConfig = new TemplateConfig();
  2. templateConfig.setController(null);
  3. templateConfig.setEntityKt(null);
  4. templateConfig.setService(null);
  5. templateConfig.setServiceImpl(null);