代码生成器

在代码生成之前,首先进行配置,MP提供了大量的自定义设置,生成的代码完全能够满足各类型的需求,如果你发现配置不能满足你的需求,欢迎提交issue和pull-request,有兴趣的也可以查看源码进行了解。

默认配置,懒人直达电梯

参数说明

参数相关的配置,详见源码

主键策略选择

MP支持以下4中主键策略,可根据需求自行选用:

描述
IdType.AUTO数据库ID自增
IdType.INPUT用户输入ID
IdType.ID_WORKER全局唯一ID,内容为空自动填充(默认配置)
IdType.UUID全局唯一ID,内容为空自动填充

AUTO、INPUT和UUID大家都应该能够明白,这里主要讲一下ID_WORKER。首先得感谢开源项目Sequence,感谢作者李景枫

什么是Sequence?简单来说就是一个分布式高效有序ID生产黑科技工具,思路主要是来源于Twitter-Snowflake算法。这里不详细讲解Sequence,有兴趣的朋友请点此去了解Sequence

MP在Sequence的基础上进行部分优化,用于产生全局唯一ID,好的东西希望推广给大家,所以我们将ID_WORDER设置为默认配置。

表及字段命名策略选择

在MP中,我们建议数据库表名表字段名采用驼峰命名方式, 如果采用下划线命名方式 请开启全局下划线开关,如果表名字段名命名方式不一致请注解指定,我们建议最好保持一致。

这么做的原因是为了避免在对应实体类时产生的性能损耗,这样字段不用做映射就能直接和实体类对应。当然如果项目里不用考虑这点性能损耗,那么你采用下滑线也是没问题的,只需要在生成代码时配置dbColumnUnderline属性就可以。

如何生成代码

方式一、代码生成

注意!模板引擎根据您的具体情况选择,自定义模板引擎请继承类 com.baomidou.mybatisplus.generator.engine.AbstractTemplateEngine

  1. <!-- 模板引擎 -->
  2. <dependency>
  3. <groupId>org.apache.velocity</groupId>
  4. <artifactId>velocity-engine-core</artifactId>
  5. <version>最新版本</version>
  6. </dependency>
  7. <!-- 模板引擎,需要指定 mpg.setTemplateEngine(new FreemarkerTemplateEngine()); -->
  8. <dependency>
  9. <groupId>org.freemarker</groupId>
  10. <artifactId>freemarker</artifactId>
  11. <version>最新版本</version>
  12. </dependency>
  13. <!-- MP 核心库 -->
  14. <dependency>
  15. <groupId>com.baomidou</groupId>
  16. <artifactId>mybatis-plus</artifactId>
  17. <version>最新版本</version>
  18. </dependency>

代码生成、示例一

  1. import java.util.HashMap;
  2. import java.util.Map;
  3. import com.baomidou.mybatisplus.generator.AutoGenerator;
  4. import com.baomidou.mybatisplus.generator.InjectionConfig;
  5. import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
  6. import com.baomidou.mybatisplus.generator.config.GlobalConfig;
  7. import com.baomidou.mybatisplus.generator.config.PackageConfig;
  8. import com.baomidou.mybatisplus.generator.config.StrategyConfig;
  9. import com.baomidou.mybatisplus.generator.config.rules.DbType;
  10. import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
  11. /**
  12. * <p>
  13. * 代码生成器演示
  14. * </p>
  15. */
  16. public class MpGenerator {
  17. /**
  18. * <p>
  19. * MySQL 生成演示
  20. * </p>
  21. */
  22. public static void main(String[] args) {
  23. AutoGenerator mpg = new AutoGenerator();
  24. // 选择 freemarker 引擎,默认 Veloctiy
  25. // mpg.setTemplateEngine(new FreemarkerTemplateEngine());
  26. // 全局配置
  27. GlobalConfig gc = new GlobalConfig();
  28. gc.setOutputDir("D://");
  29. gc.setFileOverride(true);
  30. gc.setActiveRecord(true);// 不需要ActiveRecord特性的请改为false
  31. gc.setEnableCache(false);// XML 二级缓存
  32. gc.setBaseResultMap(true);// XML ResultMap
  33. gc.setBaseColumnList(false);// XML columList
  34. // .setKotlin(true) 是否生成 kotlin 代码
  35. gc.setAuthor("Yanghu");
  36. // 自定义文件命名,注意 %s 会自动填充表实体属性!
  37. // gc.setMapperName("%sDao");
  38. // gc.setXmlName("%sDao");
  39. // gc.setServiceName("MP%sService");
  40. // gc.setServiceImplName("%sServiceDiy");
  41. // gc.setControllerName("%sAction");
  42. mpg.setGlobalConfig(gc);
  43. // 数据源配置
  44. DataSourceConfig dsc = new DataSourceConfig();
  45. dsc.setDbType(DbType.MYSQL);
  46. dsc.setTypeConvert(new MySqlTypeConvert(){
  47. // 自定义数据库表字段类型转换【可选】
  48. @Override
  49. public DbColumnType processTypeConvert(String fieldType) {
  50. System.out.println("转换类型:" + fieldType);
  51. // 注意!!processTypeConvert 存在默认类型转换,如果不是你要的效果请自定义返回、非如下直接返回。
  52. return super.processTypeConvert(fieldType);
  53. }
  54. });
  55. dsc.setDriverName("com.mysql.jdbc.Driver");
  56. dsc.setUsername("root");
  57. dsc.setPassword("521");
  58. dsc.setUrl("jdbc:mysql://127.0.0.1:3306/mybatis-plus?characterEncoding=utf8");
  59. mpg.setDataSource(dsc);
  60. // 策略配置
  61. StrategyConfig strategy = new StrategyConfig();
  62. // strategy.setCapitalMode(true);// 全局大写命名 ORACLE 注意
  63. strategy.setTablePrefix(new String[] { "tlog_", "tsys_" });// 此处可以修改为您的表前缀
  64. strategy.setNaming(NamingStrategy.underline_to_camel);// 表名生成策略
  65. // strategy.setInclude(new String[] { "user" }); // 需要生成的表
  66. // strategy.setExclude(new String[]{"test"}); // 排除生成的表
  67. // 自定义实体父类
  68. // strategy.setSuperEntityClass("com.baomidou.demo.TestEntity");
  69. // 自定义实体,公共字段
  70. // strategy.setSuperEntityColumns(new String[] { "test_id", "age" });
  71. // 自定义 mapper 父类
  72. // strategy.setSuperMapperClass("com.baomidou.demo.TestMapper");
  73. // 自定义 service 父类
  74. // strategy.setSuperServiceClass("com.baomidou.demo.TestService");
  75. // 自定义 service 实现类父类
  76. // strategy.setSuperServiceImplClass("com.baomidou.demo.TestServiceImpl");
  77. // 自定义 controller 父类
  78. // strategy.setSuperControllerClass("com.baomidou.demo.TestController");
  79. // 【实体】是否生成字段常量(默认 false)
  80. // public static final String ID = "test_id";
  81. // strategy.setEntityColumnConstant(true);
  82. // 【实体】是否为构建者模型(默认 false)
  83. // public User setName(String name) {this.name = name; return this;}
  84. // strategy.setEntityBuilderModel(true);
  85. mpg.setStrategy(strategy);
  86. // 包配置
  87. PackageConfig pc = new PackageConfig();
  88. pc.setParent("com.baomidou");
  89. pc.setModuleName("test");
  90. mpg.setPackageInfo(pc);
  91. // 注入自定义配置,可以在 VM 中使用 cfg.abc 【可无】
  92. InjectionConfig cfg = new InjectionConfig() {
  93. @Override
  94. public void initMap() {
  95. Map<String, Object> map = new HashMap<String, Object>();
  96. map.put("abc", this.getConfig().getGlobalConfig().getAuthor() + "-mp");
  97. this.setMap(map);
  98. }
  99. };
  100. // 自定义 xxList.jsp 生成
  101. List<FileOutConfig> focList = new ArrayList<FileOutConfig>();
  102. focList.add(new FileOutConfig("/template/list.jsp.vm") {
  103. @Override
  104. public String outputFile(TableInfo tableInfo) {
  105. // 自定义输入文件名称
  106. return "D://my_" + tableInfo.getEntityName() + ".jsp";
  107. }
  108. });
  109. cfg.setFileOutConfigList(focList);
  110. mpg.setCfg(cfg);
  111. // 调整 xml 生成目录演示
  112. focList.add(new FileOutConfig("/templates/mapper.xml.vm") {
  113. @Override
  114. public String outputFile(TableInfo tableInfo) {
  115. return "/develop/code/xml/" + tableInfo.getEntityName() + ".xml";
  116. }
  117. });
  118. cfg.setFileOutConfigList(focList);
  119. mpg.setCfg(cfg);
  120. // 关闭默认 xml 生成,调整生成 至 根目录
  121. TemplateConfig tc = new TemplateConfig();
  122. tc.setXml(null);
  123. mpg.setTemplate(tc);
  124. // 自定义模板配置,可以 copy 源码 mybatis-plus/src/main/resources/templates 下面内容修改,
  125. // 放置自己项目的 src/main/resources/templates 目录下, 默认名称一下可以不配置,也可以自定义模板名称
  126. // TemplateConfig tc = new TemplateConfig();
  127. // tc.setController("...");
  128. // tc.setEntity("...");
  129. // tc.setMapper("...");
  130. // tc.setXml("...");
  131. // tc.setService("...");
  132. // tc.setServiceImpl("...");
  133. // 如上任何一个模块如果设置 空 OR Null 将不生成该模块。
  134. // mpg.setTemplate(tc);
  135. // 执行生成
  136. mpg.execute();
  137. // 打印注入设置【可无】
  138. System.err.println(mpg.getCfg().getMap().get("abc"));
  139. }
  140. }

代码生成 点此去了解 、示例二

  1. new AutoGenerator().setGlobalConfig(
  2. ...
  3. ).setDataSource(
  4. ...
  5. ).setStrategy(
  6. ...
  7. ).setPackageInfo(
  8. ...
  9. ).setCfg(
  10. ...
  11. ).setTemplate(
  12. ...
  13. ).execute();

自定义模板,自定义参数 查看示例

  1. TemplateConfig templateConfig = new TemplateConfig()
  2. .setXml("/templates/mapper2.xml");//注意,不需要带上.vm
  3. InjectionConfig injectionConfig = new InjectionConfig() {
  4. @Override
  5. public void initMap() {//自定义参数
  6. Map<String, Object> map = new HashMap<>();
  7. map.put("abc", "自定义abc的值");
  8. this.setMap(map);
  9. }
  10. };
  11. new AutoGenerator()
  12. .setTemplate(templateConfig)//生成器配置自定义模板路径
  13. .setCfg(injectionConfig)//生成器配置自定义参数
  14. .xxx
  1. 模板里面用自定义参数:${cfg.abc}
  2. --cfg是固定写法, 参考AbstractTemplateEngine.batchOutput()方法;
  3. --abc就是mapput的参数名;

其他方式、 Maven插件生成

待补充(Maven代码生成插件 待完善) http://git.oschina.net/baomidou/mybatisplus-maven-plugin