Java代碼生成器——基於模板快速生成web項目結構

功能介紹

根據數據庫表的元數據生成支持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

再選擇配置文件風格後即可生成代碼

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章