ApiBoot 为 Mybatis Enhance 专属打造的代码生成器
Mybatis Enhance Codegen
是一款maven plugin
插件,在项目编译时运行,可把控是否执行生成逻辑
、可根据自己的需求过滤表名
生成,表名根据like
语法匹配,完美搭配Mybatis Enhance
使用,可自动生成数据实体
、动态查询实体
,不再为实体类映射表信息字段而犯愁、浪费个人精力。
添加插件
<build>
<plugins>
//...
<plugin>
<groupId>org.minbox.framework</groupId>
<artifactId>api-boot-mybatis-enhance-maven-codegen</artifactId>
<version>2.0.9-SNAPSHOT</version>
<dependencies>
<!--数据驱动依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
</dependencies>
<executions>
<execution>
<goals>
<goal>generator</goal>
</goals>
</execution>
</executions>
<configuration>
<execute>true</execute>
<dbName>knowledge</dbName>
<dbUrl>jdbc:mysql://localhost:3306</dbUrl>
<dbUserName>root</dbUserName>
<dbPassword>123456</dbPassword>
<packageName>org.minbox.framework.api.boot.sample</packageName>
<tableNamePattern>kl%</tableNamePattern>
</configuration>
</plugin>
//...
</plugins>
</build>
Codegen
在运行时,需要数据库驱动
的支持,我本机使用的是MySQL
,因为在上面我添加了相关的依赖。
注意:
Codegen
内部使用Code-Builder
的表信息获取的模块,MySQL的驱动默认只能使用5.x版本,不可以使用8.x。
相关配置参数
参数名 | 默认值 | 描述 |
---|---|---|
execute | false | Codegen 是否执行 |
dbName | 数据库名称 | |
dbUrl | 数据库连接路径(排除数据库名称) | |
dbUserName | 连接数据库用户名 | |
dbPassword | 连接数据库密码 | |
packageName | 生成后实体类的package | |
tableNamePattern | % | 表名过滤表达式,向like语法一样使用,默认匹配数据库内全部表 |
在上面配置中,排除有默认值的配置,其他都必须进行声明配置。
执行生成
Codegen
是在编译项目时执行,编译项目我们可以通过如下方式执行:
- 在项目根目录执行
mvn compile
- 通过IDEA工具自带的
Maven->Lifecycle->compile
窗口双击进行编译项目 - 通过IDEA工具自带的
Maven->Plugins->api-boot-mybatis-enhancecodegen:generator
窗口双击进行执行Codegen
编译过程中,控制台会进行输出自动生成表的日志信息,如下所示:
......
[INFO] Execution table: 【kl_article_info】 - 文章信息表 entity creation.
......
Codegen
会把根据tableNamePattern
查询到的表名进行输出,并且每个表会自动执行实体类
、动态查询实体
创建。
生成的实体类
实体类命名
生成的实体类的命名规则是表名驼峰
后的格式,示例如下所示:
package org.minbox.framework.api.boot.sample;
import com.gitee.hengboy.mybatis.enhance.common.annotation.Column;
import com.gitee.hengboy.mybatis.enhance.common.annotation.Id;
import com.gitee.hengboy.mybatis.enhance.common.annotation.Table;
import com.gitee.hengboy.mybatis.enhance.common.enums.KeyGeneratorTypeEnum;
import lombok.Data;
import java.sql.Timestamp;
/**
* 文章信息表
* @author ApiBoot Mybatis Enhance Codegen
*/
@Data
@Table(name = "kl_article_info")
public class KlArticleInfo {
/**
* 主键自增
*/
@Id(generatorType = KeyGeneratorTypeEnum.UUID)
@Column(name = "AI_ID")
private String aiId;
/**
* 文章所属用户
*/
@Column(name = "AI_USER_ID")
private String aiUserId;
/**
* 文章标题
*/
@Column(name = "AI_TITLE")
private String aiTitle;
/**
* 阅读量
*/
@Column(name = "AI_READ_COUNT")
private Integer aiReadCount;
/**
* 喜欢数量
*/
@Column(name = "AI_LIKE_COUNT")
private Integer aiLikeCount;
/**
* 评论数量
*/
@Column(name = "AI_COMMENT_COUNT")
private Integer aiCommentCount;
/**
* 分享数量
*/
@Column(name = "AI_SHARE_COUNT")
private Integer aiShareCount;
/**
* 文章内容
*/
@Column(name = "AI_CONTENT")
private String aiContent;
/**
* 是否为原创文章,Y:原创,N:转载
*/
@Column(name = "AI_IS_ORIGINAL")
private String aiIsOriginal;
/**
* 文章是否发布,Y:已发布,N:未发布
*/
@Column(name = "AI_IS_RELEASE")
private String aiIsRelease;
/**
* 是否热门,Y:热门,N:非热门
*/
@Column(name = "AI_IS_HOT")
private String aiIsHot;
/**
* 是否置顶,Y:置顶,N:普通
*/
@Column(name = "AI_IS_TOP")
private String aiIsTop;
/**
* 是否推荐,Y:推荐,N:不推荐
*/
@Column(name = "AI_IS_RECOMMEND")
private String aiIsRecommend;
/**
* 是否为markdown语法文章
*/
@Column(name = "AI_IS_MARKDOWN")
private String aiIsMarkdown;
/**
* 发布时间
*/
@Column(name = "AI_RELEASE_TIME")
private Timestamp aiReleaseTime;
/**
* 文章状态,O:正常,D:已删除
*/
@Column(name = "AI_STATUS")
private String aiStatus;
/**
* 备注信息
*/
@Column(name = "AI_MARK")
private String aiMark;
/**
* 文章创建时间
*/
@Column(name = "AI_CREATE_TIME")
private Timestamp aiCreateTime;
}
@Id
的主键生成策略,会根据表内主键是否定义了自增来进行判断,如果是自增使用KeyGeneratorTypeEnum.AUTO
,如果不是则使用KeyGeneratorTypeEnum.UUID
,如果你项目内是自定义的主键,可以进行修改为KeyGeneratorTypeEnum.DIY
。
生成的动态查询实体
动态查询实体命名
动态查询实体的命名规则同样是驼峰
,不过有个前缀为D
,上面实体类名称为KlArticleInfo
对应动态查询实体为DKlArticleInfo
,生成示例如下所示:
package org.minbox.framework.api.boot.sample;
import com.gitee.hengboy.mybatis.enhance.dsl.expression.ColumnExpression;
import com.gitee.hengboy.mybatis.enhance.dsl.expression.TableExpression;
/**
* 文章信息表
* @author ApiBoot Mybatis Enhance Codegen
*/
public class DKlArticleInfo extends TableExpression<KlArticleInfo> {
public DKlArticleInfo(String root) {
super(root);
}
public static DKlArticleInfo DSL() {
return new DKlArticleInfo("kl_article_info");
}
/**
* 主键自增
*/
public ColumnExpression aiId = new ColumnExpression("AI_ID", this);
/**
* 文章所属用户
*/
public ColumnExpression aiUserId = new ColumnExpression("AI_USER_ID", this);
/**
* 文章标题
*/
public ColumnExpression aiTitle = new ColumnExpression("AI_TITLE", this);
/**
* 阅读量
*/
public ColumnExpression aiReadCount = new ColumnExpression("AI_READ_COUNT", this);
/**
* 喜欢数量
*/
public ColumnExpression aiLikeCount = new ColumnExpression("AI_LIKE_COUNT", this);
/**
* 评论数量
*/
public ColumnExpression aiCommentCount = new ColumnExpression("AI_COMMENT_COUNT", this);
/**
* 分享数量
*/
public ColumnExpression aiShareCount = new ColumnExpression("AI_SHARE_COUNT", this);
/**
* 文章内容
*/
public ColumnExpression aiContent = new ColumnExpression("AI_CONTENT", this);
/**
* 是否为原创文章,Y:原创,N:转载
*/
public ColumnExpression aiIsOriginal = new ColumnExpression("AI_IS_ORIGINAL", this);
/**
* 文章是否发布,Y:已发布,N:未发布
*/
public ColumnExpression aiIsRelease = new ColumnExpression("AI_IS_RELEASE", this);
/**
* 是否热门,Y:热门,N:非热门
*/
public ColumnExpression aiIsHot = new ColumnExpression("AI_IS_HOT", this);
/**
* 是否置顶,Y:置顶,N:普通
*/
public ColumnExpression aiIsTop = new ColumnExpression("AI_IS_TOP", this);
/**
* 是否推荐,Y:推荐,N:不推荐
*/
public ColumnExpression aiIsRecommend = new ColumnExpression("AI_IS_RECOMMEND", this);
/**
* 是否为markdown语法文章
*/
public ColumnExpression aiIsMarkdown = new ColumnExpression("AI_IS_MARKDOWN", this);
/**
* 发布时间
*/
public ColumnExpression aiReleaseTime = new ColumnExpression("AI_RELEASE_TIME", this);
/**
* 文章状态,O:正常,D:已删除
*/
public ColumnExpression aiStatus = new ColumnExpression("AI_STATUS", this);
/**
* 备注信息
*/
public ColumnExpression aiMark = new ColumnExpression("AI_MARK", this);
/**
* 文章创建时间
*/
public ColumnExpression aiCreateTime = new ColumnExpression("AI_CREATE_TIME", this);
@Override
public ColumnExpression[] getColumns() {
return new ColumnExpression[]{aiId, aiUserId, aiTitle, aiReadCount, aiLikeCount, aiCommentCount, aiShareCount, aiContent, aiIsOriginal, aiIsRelease, aiIsHot, aiIsTop, aiIsRecommend, aiIsMarkdown, aiReleaseTime, aiStatus, aiMark, aiCreateTime};
}
}
实体生成后的位置在哪?
Codegen
所生成的所有实体都位于项目根目录下的target/generated-sources/java
下,可以自行复制到业务目录、或者直接使用。
使用动态查询实体示例
/**
* Mybatis Enhance Dsl Factory
*/
@Autowired
private EnhanceDslFactory dslFactory;
/**
* 根据文章编号查询示例
*
* @param articleId 文章编号
* @return
*/
public KlArticleInfo selectById(String articleId) {
DKlArticleInfo dKlArticleInfo = DKlArticleInfo.DSL();
return dslFactory.createSearchable()
.selectFrom(dKlArticleInfo)
// 文章主键
.where(dKlArticleInfo.aiId.eq(articleId))
// and 状态正常
.and(dKlArticleInfo.aiStatus.eq("O"))
.resultType(KlArticleInfo.class)
.fetchOne();
}