功能介紹
根據數據庫表的元數據生成支持Rest、RPC協議的工程服務(標準化的代碼分層結構工程)。 加速新工程的建設。
代碼結構:
生成代碼的結構依賴於模板的定義。本工程中定義分爲三個工程
${projectName}-domain-api:接口層 - RPC接口API工程
${projectName}-domain:領域層 - RPC接口實現(包含domain層 + 基礎設施層)
${projectName}-application:應用層 - Rest接口實現
Web應用層工程
應用層,實現領域間協作、任務編排、Rest服務等。其包結構規範如下:
領域服務接口層工程
領域服務的API接口,包括DTO、領域服務接口等。其包結構規範如下:
領域服務實現層工程
領域服務的實現層,包括領域對象、領域服務及持久化層的具體實現。其包結構規範如下:
實現方法
引入
我們使用的是rapid-framework框架生成項目,pom中的引入如下:
<dependency>
<groupId>com.googlecode.rapid-framework</groupId>
<artifactId>rapid-generator</artifactId>
<version>4.0.6</version>
</dependency>
模板
項目生成依賴於模板文件,新建template文件夾放置模板,同時包含以下幾個文件
配置
generator.xml
生成項目時的配置信息,放入Resource文件夾中
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>
代碼生成器配置文件:
1.會爲所有的property生成property_dir屬性,如pkg=com.company => pkg_dir=com/company
2.可以引用環境變量: ${env.JAVA_HOME} or System.properties: ${user.home},property之間也可以相互引用
</comment>
<entry key="basepackage">com.name</entry>
<!-- jsp namespace: web/${namespace}/${className}/list.jsp -->
<entry key="namespace">pages</entry>
<entry key="outRoot">/Users/</entry>
<!-- 需要移除的表名前綴,使用逗號進行分隔多個前綴,示例值: t_,v_ -->
<entry key="tableRemovePrefixes">t_</entry>
<entry key="jdbc_username">username</entry>
<entry key="jdbc_password">password</entry>
<entry key="jdbc_url">jdbc:mysql://XXX</entry>
<entry key="jdbc_driver">com.mysql.jdbc.Driver</entry>
<!-- oracle需要指定jdbc.schema,其它數據庫忽略此項配置 -->
<!--<entry key="jdbc_schema"></entry>-->
<!--<entry key="jdbc_catalog"></entry>-->
<!-- 數據庫類型映射 -->
<entry key="java_typemapping.java.sql.Timestamp">java.util.Date</entry>
<entry key="java_typemapping.java.sql.Date">java.util.Date</entry>
<entry key="java_typemapping.java.sql.Time">java.util.Date</entry>
<entry key="java_typemapping.java.lang.Byte">Integer</entry>
<entry key="java_typemapping.java.lang.Short">Integer</entry>
<entry key="java_typemapping.java.math.BigDecimal">Long</entry>
</properties>
generator.properties
生成的項目基本信息
projectName=demoapp-test
groupName=com.group
versionName=1.0.0-SNAPSHOT
log4j.properties
### 設置###
log4j.rootLogger = debug,stdout,D,E
### 輸出信息到控制擡 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
運行
codeGenerator.java
public class CodeGenerator {
public static void main(String[] args) throws Exception {
// 模板地址,默認爲項目根目錄
String templatePath = "template";
GeneratorFacade g = new GeneratorFacade();
Customizer customizer = new Customizer(g.getGenerator().getOutRootDir());
//選擇配置文件風格
customizer.determineCfgStyle();
g.getGenerator().addTemplateRootDir(templatePath);
// 刪除生成器的輸出目錄
//g.deleteOutRootDir();
// 通過數據庫表生成文件
g.generateByTable("t_student");
customizer.processCfgStyle();
System.out.println("代碼生成完畢");
// g.generateByTable("t_student","t_location");
// 自動搜索數據庫中的所有表並生成文件,template爲模板的根目錄
// g.generateByAllTable();
// 按table名字刪除文件
// g.deleteByTable("table_name", "template");
}
}
Customizer.java
我們的需求中,不同的項目組成員可能使用不同風格的配置文件,有的用.properties,有的用yaml。因此在生成時,兩種風格的配置文件同時生成,在根據其選擇,遞歸地刪除不需要的文件。
public class Customizer {
/**
* outPath:輸出目錄
*/
private String outPath;
/**
* deleteStyle: 需要被刪除的風格文件類型
*/
private String deleteStyle;
public Customizer(String outPath) {
this.outPath = outPath;
}
/**
* @Description 提示支持的配置文件風格並從控制檯選擇
**/
public void determineCfgStyle(){
System.out.println("配置文件風格選擇:yaml風格輸入1,properties風格輸入2");
Scanner sc = new Scanner(System.in);
int cfgStyle = sc.nextInt();
if (cfgStyle==1){
this.deleteStyle = "properties";
}else {
this.deleteStyle = "yml";
}
}
/**
* @Description 根據選擇的風格刪除冗餘的配置文件
**/
public void processCfgStyle(){
File file = new File(outPath);
delete(file,deleteStyle);
}
private void delete(File f, String includeName)
{
File[] fi=f.listFiles();
if (null!=fi) {
//遍歷文件和文件夾
for (File file : fi) {
//如果是文件夾,遞歸查找
if (file.isDirectory()) {
delete(file, includeName);
} else if (file.isFile()) {
String filename = file.getName();
if (filename.endsWith(includeName)) {
file.delete();
}
}
}
}
}
}
打包
我們嘗試將代碼生成器打爲jar包,並可配置個性化數據。但是可配置的文件已經寫死在Resource文件夾內。
想出的第一種解決方法是,根據輸入,動態修改配置文件,但打包成jar之後,jar內的文件無法修改,放棄;第二種方法是希望從外部讀取指定的配置文件,但是使用的源碼從classpath中直接讀取,已經寫死。
最終使用第二種方法實現。解決方法是:命令行運行時,指定classpass的掃描路徑,指令爲-Xbootclasspath/a:[當前文件夾的絕對路徑]
使用方法
將release文件夾內的所有文件,放置於本地的一個文件夾內。命令行運行如下命令:
java -Xbootclasspath/a:./ -jar scc-rapid-generator.jar
再選擇配置文件風格後即可生成代碼