ApiBoot Mybatis Enhance Codegen

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

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

生成的动态查询实体

动态查询实体命名

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

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

实体生成后的位置在哪?

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

使用动态查询实体示例

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