模型生成器
基于模型信息生成相关文件以实现特定功能。
1. 黄金管家模板分析
1.1. 黄金管家项目结构
关于项目名称,需要区分逻辑项目名称和目录项目名称:
-
逻辑项目名称:开发者给项目的命名,例如:demo、ai等
-
目录项目名称:在创建项目源码时给项目目录的命名,一般会加上公司名前缀,例如:aum-demo、aum-ai等
以上项目名称指目录项目名称, 以下用项目名称(或项目名)表示逻辑项目名称, 目录项目名称(或目录项目名)表示目录项目名称。
关于模块,需要区分项目模块和模型模块:
-
项目模块:指项目的下级模块,是目录结构上的划分
-
模型模块:指模型对应到功能实现上的模块
以下用项目模块表示项目模块,模块表示模型模块。
1.3. 黄金管家模板源码结构
主要包括三部分:
-
模板:即vm文件,用于生成文件
-
模板配置,即properties文件,用于配置模板及其生成文件的存储路径
-
AutoConfiguration配置,即java文件和spring.factories,用于自动加载配置到系统中
link:peacetrue-modelgenerator-template-aum/src/main/resources/peacetrue.modelgenerator.template.aum.properties[]
2. 模板编写指导
模板引擎使用 velocity,开发者需要了解其语法。
2.2. 内置扩展属性
考虑到主键属性比较特殊, 单独将其作为idProperty
暴露到模板中, 它是一个模型属性对象。
在生成java文件时需要使用到包名, 也将其作为packageName
暴露到模板中。
2.3. 自定义扩展属性
实现接口TemplatePropertiesSupplier
提供需要暴露自定义属性。
3. 模板配置指导
配置属性以前缀peacetrue.model-generator作为起始, 以下描述以.开头,均表示省略前缀。
- .templates[0].path
-
指定模板路径,以classpath:作为前缀,从类路径读取;以file:作为前缀,从文件路径读取。
- .templates[0].package-name
-
如果是生成java文件,则需要指定包名;html文件不需要。 例如:
com.aum.demo.modules.test
。 如果需要根据模型信息动态变化,可以使用SPEL表达式,支持读取模型属性, 例如:com.aum.demo.modules.#{lowerName}
。 - .templates[0].output-path
-
指定生成文件的存储路径, 例如:
.templates[0].output-path=/Users/xiayx/Documents/Projects/aum-demo/aum-demo-service-api/src/main/java/com/aum/demo/modules/test/Test.java
。 路径太长,可以使用.projectPath=/Users/xiayx/Documents/Projects/aum-demo
指定项目路径, 则.templates[0].output-path=/aum-demo-service-api/src/main/java/com/aum/demo/modules/test/Test.java
; 如果需要动态变化,可使用属性占位符和SPEL表达式,例如:.templates[0].output-path=/${.module-prefix}-service-api/src/main/java/${.package-prefix-path}/#{lowerName}/#{name}.java
,.module-prefix
用于指定项目模块名称前缀,.package-prefix-path
用于指定包前缀路径。
以上路径还可以按照标准结构进行细化:
link:peacetrue-modelgenerator-template/src/main/resources/peacetrue.modelgenerator.template.properties[]
- .templates
-
指定多个具体的模板信息
- .template
-
指定具体模板的缺省配置,templates下为空的属性会使用template对应的属性
4. 数据源模型指导
4.1. 表名转模型名
默认将下划线分隔式转换成大写驼峰式,例如:order_task → OrderTask。 如需自定义请实现TableNameToModelName
。
4.2. 列名转属性名
默认将下划线分隔式转换成小写驼峰式,例如:order_task → orderTask。 如需自定义请实现ColumnNameToPropertyName
。
4.3. Sql类型转Java类型
默认实现参考 mapping_sql_and_java_data_types, 如需自定义请实现SqlTypeToJavaType
。
5. 技术实现分析
基于spring-boot2实现。
5.1. 模块关系结构
开发者可根据需要选择依赖的类库, 如果只使用核心生成功能,则依赖peacetrue-modelgenerator
, 需要自行实现模板供应者TemplateSupplier
和模型信息供应者ModelSupplier
。 也可以基于peacetrue-modelgenerator-template
提供模板实现; 或者使用数据库模型信息供应者peacetrue-modelgenerator-model-datasource
。
5.2. maven依赖配置
<dependency>
<groupId>com.github.peacetrue.modelgenerator</groupId>
<artifactId>peacetrue-modelgenerator</artifactId>
<version>1.0-RELEASE</version>
</dependency>
<dependency>
<groupId>com.github.peacetrue.modelgenerator</groupId>
<artifactId>peacetrue-modelgenerator-template</artifactId>
<version>1.0-RELEASE</version>
</dependency>
<dependency>
<groupId>com.github.peacetrue.modelgenerator</groupId>
<artifactId>peacetrue-modelgenerator-model-datasource</artifactId>
<version>1.0-RELEASE</version>
</dependency>