利用業餘時間擼了一個Spring Jpa代碼生成器jpa-codegen。
簡介
這是一款基於Freemarker
模板驅動的代碼生成器。
依據現有的實體類代碼,自動生成CRUD代碼,解放雙手,加快開發速度。
生成的代碼包括但不僅限於(可以自定義生成模塊)
- Form表單代碼
- Repository代碼
- Service代碼
- Controller代碼
SpringBoot使用示例
克隆示例項目,體會解放雙手的美妙感受!
如何使用
導入倉庫#
Copy
maven { url 'https://dl.bintray.com/gcdd1993/maven' } dependencies { // jpa code generator testCompile 'io.github.gcdd1993:jpa-codegen:v1.0.1' testCompile 'org.freemarker:freemarker:2.3.28' }
配置代碼生成器#
配置文件#
Copy
## 作者 author=gcdd1993 ## 代碼註釋 comments=code generated by jpa-codegen ## 是否覆蓋原文件,除非特殊情況,不然請不要覆蓋 cover=false ## 代碼模板目錄 template.dir=src/test/resources/template/ ## 實體類包名 Deprecated從v1.0.1開始從配置文件中移除 - entity.package=com.maxtropy.sample.entity ## 實體類標識符 Deprecated從v1.0.1開始從配置文件中移除 - entity.flag=entity ## 以下配置是模塊配置(格式 模塊名.配置名),必須在模板目錄下提供與模塊名相同的模板 ## 生成的代碼後綴 repository.suffix=Repository ## 模板名稱 repository.template=repository.ftl ## 模塊標識符 repository.flag=entity.repo service.suffix=Service service.template=service.ftl service.flag=service form.suffix=Form form.template=form.ftl form.flag=form controller.suffix=Controller controller.template=controller.ftl controller.flag=web
其中
Copy
repository.suffix=Repository repository.template=repository.ftl repository.flag=entity.repo
是模塊配置,什麼是模塊?
編寫代碼模板#
模板主要基於Freemarker
,如Spring Boot2.x
代碼模板可以像下面這樣
Copy
package ${packageName}; import ${entity.packageName}.${entity.className}; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.querydsl.QuerydslPredicateExecutor; <#list imports as import> import ${import}; </#list> /** * repository for ${entity.className} generated by jpa-codegen * ${comments} * * @author ${author} * Created On ${date}. */ public interface ${className} extends JpaRepository<${entity.className}, ${entity.id.className}>, QuerydslPredicateExecutor<${entity.className}> { }
編寫生成器入口#
在test模塊中編寫生成器入口,如
Copy
public class Codegen { @Test public void generate() { new CodeGenerator("src/test/resources/codegen.properties") .registerRender("repository") .generate(); } }
然後運行generate()
,在項目目錄下將會生成
生成的代碼完全由模板以及實體類信息決定。
如何編寫模板?
模板完全基於FreeMarker
以及實體類信息,FreeMarker
參考FreeMarker Docs
支持的元素定義如下
基本信息#
Freemarker元素 | 解釋 | 示例輸出 |
---|---|---|
${ftlName} |
模板名稱 | controller.ftl |
${ftlPath} |
模板目錄 | src/main/resources/template/ |
${savePath} |
保存路徑 | src/main/resources/io/github/gcdd1993/controller |
${packageName} |
java文件包名 | io.github.gcdd1993.controller |
${className} |
java文件類名 | UserController |
${author} |
作者 | gaochen |
${date} |
創建日期,默認爲當前日期 | 2019/6/23 |
${comments} |
註釋信息 | generated by jpa-codegen |
${imports} |
java文件引入信息 | org.springframework.beans.factory.annotation.Autowired |
實體信息#
Freemarker元素 | 解釋 | 示例輸出 |
---|---|---|
${entity.className} |
實體類名,class.getSimpleName() |
User |
${entity.packageName} |
實體包名,class.getPackage().getName() |
io.github.gcdd1993 |
${entity.tableName} |
實體表名,@Table(name="") |
sys_user |
${entity.id.className} |
實體主鍵類名,@Id 註釋的字段的類名 |
Integer |
${entity.id.packageName} |
實體主鍵包名,@Id 註釋的字段的包名 |
java.lang |
${entity.fields.className} |
實體所有字段(只支持基本類型)類名 | String |
${entity.fields.packageName} |
實體所有字段(只支持基本類型)包名 | java.lang |
${entity.fields.name} |
實體所有字段(只支持基本類型)屬性名 | name |
${entity.fields.annotations.className} |
實體所有字段註解的類名 | Id |
${entity.fields.annotations.packageName} |
實體所有字段註解的包名 | javax.persistence |
自定義配置#
除了以上默認的信息之外,可能會有額外的信息需要填入生成的代碼中,jpa-codegen提供直接將配置文件中的配置渲染到模板的能力。
例如在配置文件autogen.properties
寫下一行
Copy
custom.additional.comment=this is additional comment
在模板中可以使用${otherParams.additional_comment}
獲取到該配置。
要注意的是:自定義配置使用custom
開頭,後面的配置會將.替換爲_作爲FreeMarker
模板的key,例如上述的additional.comment
使用${otherParams.additional_comment}
獲取。
什麼是模塊?
由於代碼千變萬化,爲了儘可能的做到通用性,jpa-codegen將每一種類型的代碼抽象爲模塊,每一個模塊將使用各自的模板,依照實體信息生成代碼。
需要爲模板配置一下信息:
- repository.suffix=Repository
模塊類名後綴,生成的類名規則由實體類名+後綴構成
- repository.template=repository.ftl
模塊使用的Freemarker
模板
- repository.flag=entity.repo
模塊標識符,生成的代碼包名由實體類將實體標識符替換爲模塊標識符來確認。
如
- 實體包名:
io.github.gcdd1993.entity
- 實體標識符:
entity
- 模塊標識符:
entity.repo
則生成的repository
代碼包名爲 --> io.github.gcdd1993.entity.repo