ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## 代码生成 BeetlSQL提供了弹性的代码生机制,可以根据数据库的定义生成java代码,文档,业务代码,BeetlSQL自身提供了一套生成模板,用户可以复用或者修改这些模板,或者提供新的模板,比如生成Controller代码 `SourceConfig`是核心类,接收参数SQLManager以及一组SourceBuilder,前者用于获取metadata,后者是具体执行生成过程 ```java public SourceConfig(SQLManager sqlManager,List<SourceBuilder> sourceBuilder) { this(sqlManager,false); this.sourceBuilder = sourceBuilder; } public void gen(String tableName, BaseProject project){} public void genAll(BaseProject project, SourceFilter sourceFilter){} ``` gen或者genAll方法用于开始执行,每个tableName都会传递给sourceBuilder集合,一次运行 SourceBuilder 需要实现如下方法,执行具体的生成动作 ```java public abstract void generate(BaseProject project, SourceConfig config,Entity entity); ``` 参数BaseProject提供了生成的基本信息,比如BaseProject的子类ConsoleOnlyProject,会提供一个基于System.out的输出流,因此生成的代码都打印在控制台,而SimpleMavenProject 则提供一个文件路径,代码会按照包名保存到相应的工程文件里 Entity 对象则是目标表或者视图的描述,包含了java属性,类型,数据库的列名,类型,备注等信息,足够生成一个java类 用户通常需要完成SourceBuilder来实现代码生成,生成到文件,控制台,还是其他地方则是通过BaseProject决定 如下是一个根据表生成数据库表的描述文档 ```java public class MDDocBuilder extends BaseTemplateSourceBuilder { public static String mapperTemplate="doc.btl.md"; public MDDocBuilder() { super("doc"); } @Override public void generate(BaseProject project, SourceConfig config, Entity entity) { //BeetlSQl中的配置 Beetl beetl = ((BeetlTemplateEngine)config.getSqlManager().getSqlTemplateEngine()).getBeetl(); //模板 Template template = groupTemplate.getTemplate(mapperTemplate); template.binding("tableName", entity.getTableName()); template.binding("comment", entity.getComment()); template.binding("colsMap", entity.getTableDesc().getColsDetail()); template.binding("table", entity.getTableDesc()); String mdFileName = StringKit.toLowerCaseFirstOne(entity.getName())+".doc..md"; Writer writer = project.getWriterByName(this.name,mdFileName); template.renderTo(writer); } ``` 对应的模板doc.btl.md 如下 ```markdown ## ${tableName} **说明** ${isEmpty(comment)?"无注释":comment} **表信息** <% var ids = table.idNames; %> * 主键 ${ids} * 表注释 | 名称 | 数据类型 | 长度 | 说明 | | :--: | :--- | :------: | :----: | <% for(col in colsMap){ var name = col.key; if(@ids.contains(name)){ name="*"+name; } var detail = col.value; var dbType =@org.beetl.sql.clazz.kit.JavaType.jdbcTypeId2Names.get(detail.sqlType); %> |${name} | ${dbType}| ${detail.size} | ${detail.remark} | <%}%> ```