ApiBoot 为 Mybatis Enhance 专属打造的代码生成器

Mybatis Enhance Codegen是一款maven plugin插件,在项目编译时运行,可把控是否执行生成逻辑、可根据自己的需求过滤表名生成,表名根据like语法匹配,完美搭配Mybatis Enhance使用,可自动生成数据实体动态查询实体,不再为实体类映射表信息字段而犯愁、浪费个人精力。

添加插件

  1. <build>
  2. <plugins>
  3. //...
  4. <plugin>
  5. <groupId>org.minbox.framework</groupId>
  6. <artifactId>api-boot-mybatis-enhance-maven-codegen</artifactId>
  7. <version>2.0.9-SNAPSHOT</version>
  8. <dependencies>
  9. <!--数据驱动依赖-->
  10. <dependency>
  11. <groupId>mysql</groupId>
  12. <artifactId>mysql-connector-java</artifactId>
  13. <version>5.1.47</version>
  14. </dependency>
  15. </dependencies>
  16. <executions>
  17. <execution>
  18. <goals>
  19. <goal>generator</goal>
  20. </goals>
  21. </execution>
  22. </executions>
  23. <configuration>
  24. <execute>true</execute>
  25. <dbName>knowledge</dbName>
  26. <dbUrl>jdbc:mysql://localhost:3306</dbUrl>
  27. <dbUserName>root</dbUserName>
  28. <dbPassword>123456</dbPassword>
  29. <packageName>org.minbox.framework.api.boot.sample</packageName>
  30. <tableNamePattern>kl%</tableNamePattern>
  31. </configuration>
  32. </plugin>
  33. //...
  34. </plugins>
  35. </build>

Codegen在运行时,需要数据库驱动的支持,我本机使用的是MySQL,因为在上面我添加了相关的依赖。

注意:Codegen内部使用Code-Builder的表信息获取的模块,MySQL的驱动默认只能使用5.x版本,不可以使用8.x。

相关配置参数

参数名默认值描述
executefalseCodegen是否执行
dbName数据库名称
dbUrl数据库连接路径(排除数据库名称)
dbUserName连接数据库用户名
dbPassword连接数据库密码
packageName生成后实体类的package
tableNamePattern%表名过滤表达式,向like语法一样使用,默认匹配数据库内全部表

在上面配置中,排除有默认值的配置,其他都必须进行声明配置。

执行生成

Codegen是在编译项目时执行,编译项目我们可以通过如下方式执行:

  • 在项目根目录执行mvn compile
  • 通过IDEA工具自带的Maven->Lifecycle->compile窗口双击进行编译项目
  • 通过IDEA工具自带的Maven->Plugins->api-boot-mybatis-enhancecodegen:generator窗口双击进行执行Codegen编译过程中,控制台会进行输出自动生成表的日志信息,如下所示:
  1. ......
  2. [INFO] Execution table: kl_article_info - 文章信息表 entity creation.
  3. ......

Codegen会把根据tableNamePattern查询到的表名进行输出,并且每个表会自动执行实体类动态查询实体创建。

生成的实体类

实体类命名

生成的实体类的命名规则是表名驼峰后的格式,示例如下所示:

  1. package org.minbox.framework.api.boot.sample;
  2. import com.gitee.hengboy.mybatis.enhance.common.annotation.Column;
  3. import com.gitee.hengboy.mybatis.enhance.common.annotation.Id;
  4. import com.gitee.hengboy.mybatis.enhance.common.annotation.Table;
  5. import com.gitee.hengboy.mybatis.enhance.common.enums.KeyGeneratorTypeEnum;
  6. import lombok.Data;
  7. import java.sql.Timestamp;
  8. /**
  9. * 文章信息表
  10. * @author ApiBoot Mybatis Enhance Codegen
  11. */
  12. @Data
  13. @Table(name = "kl_article_info")
  14. public class KlArticleInfo {
  15. /**
  16. * 主键自增
  17. */
  18. @Id(generatorType = KeyGeneratorTypeEnum.UUID)
  19. @Column(name = "AI_ID")
  20. private String aiId;
  21. /**
  22. * 文章所属用户
  23. */
  24. @Column(name = "AI_USER_ID")
  25. private String aiUserId;
  26. /**
  27. * 文章标题
  28. */
  29. @Column(name = "AI_TITLE")
  30. private String aiTitle;
  31. /**
  32. * 阅读量
  33. */
  34. @Column(name = "AI_READ_COUNT")
  35. private Integer aiReadCount;
  36. /**
  37. * 喜欢数量
  38. */
  39. @Column(name = "AI_LIKE_COUNT")
  40. private Integer aiLikeCount;
  41. /**
  42. * 评论数量
  43. */
  44. @Column(name = "AI_COMMENT_COUNT")
  45. private Integer aiCommentCount;
  46. /**
  47. * 分享数量
  48. */
  49. @Column(name = "AI_SHARE_COUNT")
  50. private Integer aiShareCount;
  51. /**
  52. * 文章内容
  53. */
  54. @Column(name = "AI_CONTENT")
  55. private String aiContent;
  56. /**
  57. * 是否为原创文章,Y:原创,N:转载
  58. */
  59. @Column(name = "AI_IS_ORIGINAL")
  60. private String aiIsOriginal;
  61. /**
  62. * 文章是否发布,Y:已发布,N:未发布
  63. */
  64. @Column(name = "AI_IS_RELEASE")
  65. private String aiIsRelease;
  66. /**
  67. * 是否热门,Y:热门,N:非热门
  68. */
  69. @Column(name = "AI_IS_HOT")
  70. private String aiIsHot;
  71. /**
  72. * 是否置顶,Y:置顶,N:普通
  73. */
  74. @Column(name = "AI_IS_TOP")
  75. private String aiIsTop;
  76. /**
  77. * 是否推荐,Y:推荐,N:不推荐
  78. */
  79. @Column(name = "AI_IS_RECOMMEND")
  80. private String aiIsRecommend;
  81. /**
  82. * 是否为markdown语法文章
  83. */
  84. @Column(name = "AI_IS_MARKDOWN")
  85. private String aiIsMarkdown;
  86. /**
  87. * 发布时间
  88. */
  89. @Column(name = "AI_RELEASE_TIME")
  90. private Timestamp aiReleaseTime;
  91. /**
  92. * 文章状态,O:正常,D:已删除
  93. */
  94. @Column(name = "AI_STATUS")
  95. private String aiStatus;
  96. /**
  97. * 备注信息
  98. */
  99. @Column(name = "AI_MARK")
  100. private String aiMark;
  101. /**
  102. * 文章创建时间
  103. */
  104. @Column(name = "AI_CREATE_TIME")
  105. private Timestamp aiCreateTime;
  106. }

@Id的主键生成策略,会根据表内主键是否定义了自增来进行判断,如果是自增使用KeyGeneratorTypeEnum.AUTO,如果不是则使用KeyGeneratorTypeEnum.UUID,如果你项目内是自定义的主键,可以进行修改为KeyGeneratorTypeEnum.DIY

生成的动态查询实体

动态查询实体命名

动态查询实体的命名规则同样是驼峰,不过有个前缀为D,上面实体类名称为KlArticleInfo对应动态查询实体为DKlArticleInfo,生成示例如下所示:

  1. package org.minbox.framework.api.boot.sample;
  2. import com.gitee.hengboy.mybatis.enhance.dsl.expression.ColumnExpression;
  3. import com.gitee.hengboy.mybatis.enhance.dsl.expression.TableExpression;
  4. /**
  5. * 文章信息表
  6. * @author ApiBoot Mybatis Enhance Codegen
  7. */
  8. public class DKlArticleInfo extends TableExpression<KlArticleInfo> {
  9. public DKlArticleInfo(String root) {
  10. super(root);
  11. }
  12. public static DKlArticleInfo DSL() {
  13. return new DKlArticleInfo("kl_article_info");
  14. }
  15. /**
  16. * 主键自增
  17. */
  18. public ColumnExpression aiId = new ColumnExpression("AI_ID", this);
  19. /**
  20. * 文章所属用户
  21. */
  22. public ColumnExpression aiUserId = new ColumnExpression("AI_USER_ID", this);
  23. /**
  24. * 文章标题
  25. */
  26. public ColumnExpression aiTitle = new ColumnExpression("AI_TITLE", this);
  27. /**
  28. * 阅读量
  29. */
  30. public ColumnExpression aiReadCount = new ColumnExpression("AI_READ_COUNT", this);
  31. /**
  32. * 喜欢数量
  33. */
  34. public ColumnExpression aiLikeCount = new ColumnExpression("AI_LIKE_COUNT", this);
  35. /**
  36. * 评论数量
  37. */
  38. public ColumnExpression aiCommentCount = new ColumnExpression("AI_COMMENT_COUNT", this);
  39. /**
  40. * 分享数量
  41. */
  42. public ColumnExpression aiShareCount = new ColumnExpression("AI_SHARE_COUNT", this);
  43. /**
  44. * 文章内容
  45. */
  46. public ColumnExpression aiContent = new ColumnExpression("AI_CONTENT", this);
  47. /**
  48. * 是否为原创文章,Y:原创,N:转载
  49. */
  50. public ColumnExpression aiIsOriginal = new ColumnExpression("AI_IS_ORIGINAL", this);
  51. /**
  52. * 文章是否发布,Y:已发布,N:未发布
  53. */
  54. public ColumnExpression aiIsRelease = new ColumnExpression("AI_IS_RELEASE", this);
  55. /**
  56. * 是否热门,Y:热门,N:非热门
  57. */
  58. public ColumnExpression aiIsHot = new ColumnExpression("AI_IS_HOT", this);
  59. /**
  60. * 是否置顶,Y:置顶,N:普通
  61. */
  62. public ColumnExpression aiIsTop = new ColumnExpression("AI_IS_TOP", this);
  63. /**
  64. * 是否推荐,Y:推荐,N:不推荐
  65. */
  66. public ColumnExpression aiIsRecommend = new ColumnExpression("AI_IS_RECOMMEND", this);
  67. /**
  68. * 是否为markdown语法文章
  69. */
  70. public ColumnExpression aiIsMarkdown = new ColumnExpression("AI_IS_MARKDOWN", this);
  71. /**
  72. * 发布时间
  73. */
  74. public ColumnExpression aiReleaseTime = new ColumnExpression("AI_RELEASE_TIME", this);
  75. /**
  76. * 文章状态,O:正常,D:已删除
  77. */
  78. public ColumnExpression aiStatus = new ColumnExpression("AI_STATUS", this);
  79. /**
  80. * 备注信息
  81. */
  82. public ColumnExpression aiMark = new ColumnExpression("AI_MARK", this);
  83. /**
  84. * 文章创建时间
  85. */
  86. public ColumnExpression aiCreateTime = new ColumnExpression("AI_CREATE_TIME", this);
  87. @Override
  88. public ColumnExpression[] getColumns() {
  89. return new ColumnExpression[]{aiId, aiUserId, aiTitle, aiReadCount, aiLikeCount, aiCommentCount, aiShareCount, aiContent, aiIsOriginal, aiIsRelease, aiIsHot, aiIsTop, aiIsRecommend, aiIsMarkdown, aiReleaseTime, aiStatus, aiMark, aiCreateTime};
  90. }
  91. }

实体生成后的位置在哪?

Codegen所生成的所有实体都位于项目根目录下的target/generated-sources/java下,可以自行复制到业务目录、或者直接使用。

使用动态查询实体示例

  1. /**
  2. * Mybatis Enhance Dsl Factory
  3. */
  4. @Autowired
  5. private EnhanceDslFactory dslFactory;
  6. /**
  7. * 根据文章编号查询示例
  8. *
  9. * @param articleId 文章编号
  10. * @return
  11. */
  12. public KlArticleInfo selectById(String articleId) {
  13. DKlArticleInfo dKlArticleInfo = DKlArticleInfo.DSL();
  14. return dslFactory.createSearchable()
  15. .selectFrom(dKlArticleInfo)
  16. // 文章主键
  17. .where(dKlArticleInfo.aiId.eq(articleId))
  18. // and 状态正常
  19. .and(dKlArticleInfo.aiStatus.eq("O"))
  20. .resultType(KlArticleInfo.class)
  21. .fetchOne();
  22. }