Java之利用FreeMarker引擎實現枚舉和腳本自動生成

開心一笑

【天氣熱了 翻箱倒柜找了半天短袖 結果找出來一看 全是些名牌短袖 感覺穿出去太高調了 比如什么中國電信啊 天翼4G啊 太太樂雞精啊 蓮花味精啊 海天醬油啊。。最珍貴的一件 要屬那件史丹利復合肥 跟劉能同款 哎頭大了糾結該穿哪個好呢?穿出去不會被人說我炫富吧】

對不起

提出問題

如何利用Java + FreeMarker 生成枚舉類和相關的數據庫腳本???

解決問題

業務場景

做業務開發的時候,我們通常要定義很多枚舉類,寫好java枚舉類時候,還要在數據庫插入相對應的字典值等,然后生成 sql 文件提交到SVN的增量腳本里面。為了解決這些問題,有必要開發一個枚舉和腳本自動生成的工具類, 自動生成枚舉類和增量腳本,避免簡單和不必要的錯誤。

分享的這個工具類,并不是適合每個公司,因為每家公司有每家公司的框架,只是想傳達一種實現:多開發一些適合你們公司的工具類,減少重復性的工作,把跟多的時間和精力投入到重要的事情上。

代碼實現

EnumGenerateUtils工具類

在我們的項目中,枚舉是有分類的。

package com.evada.inno.pm.code.generate.util;
import com.evada.inno.pm.code.generate.model.EnumDictCategoryDefinition;
import com.evada.inno.pm.code.generate.model.EnumInfoDefinition;
import freemarker.template.Template;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * 描述:枚舉類代碼生成工具
 * Created by Ay on 2017/5/5.
 */
public class EnumGenerateUtils {

    //枚舉需要生成到那個包下面
    private final String packageName = "com.evada.pm.process.manage";
    //枚舉分類的code 和 字典表中的 categoryCode必須一致
    private final String enumCategoryCode = "TM_XXXX_XXXX_XXXX";
    private final String enumCategoryName = "項目管理-管控模式-枚舉";
    //枚舉類名稱
    private final String enumClassName = "Color";
    //枚舉類生成后類上的注解
    private final String enumAnnotation = "顏色";
    //這里比較重要
    private final String[][] ENUM_INFO = {
            {"BLUE","藍色"},
            {"YELLOW","黃色"},
            {"BLACK","黑色"}
    };
    //類上的作者
    private final String AUTHOR = "Ay";
    //類上的日期
    private final String CURRENT_DATE = new SimpleDateFormat("yyyy-MM-dd").format(new Date());

    public static void main(String[] args) throws Exception{
        EnumGenerateUtils enumGenerateUtils = new EnumGenerateUtils();
        //生成枚舉類java文件
        enumGenerateUtils.generateEnumClassFile();
        //生成sql腳本文件
        enumGenerateUtils.generateEnumSqlFile();
    }


    private void generateEnumSqlFile() throws Exception{
        final String suffix = ".sql";
        final String path = "D://" + CURRENT_DATE + suffix;
        final String templateName = "EnumSQL.ftl";
        File mapperFile = new File(path);
        Map<String,Object> dataMap = new HashMap<>();
        List<EnumInfoDefinition> enumInfoDefinitionList = new ArrayList<>();
        EnumInfoDefinition enumInfoDefinition = null;
        for(int i=0;i < ENUM_INFO.length;i++){
            enumInfoDefinition = new EnumInfoDefinition();
            enumInfoDefinition.setEnumUuid(EnumGenerateUtils.generateUUID());
            enumInfoDefinition.setEnumCode(ENUM_INFO[i][0]);
            enumInfoDefinition.setEnumName(ENUM_INFO[i][1]);
            enumInfoDefinition.setEnumCategoryCode(enumCategoryCode);
            enumInfoDefinition.setEnumNumber(i + 1 + "");
            enumInfoDefinition.setEnumSortOrder(i + 1 + "");
            enumInfoDefinitionList.add(enumInfoDefinition);
        }
        EnumDictCategoryDefinition dictCategory = new EnumDictCategoryDefinition();
        dictCategory.setEnumUuid(EnumGenerateUtils.generateUUID());
        dictCategory.setEnumCategoryCode(enumCategoryCode);
        dictCategory.setEnumCategoryName(enumCategoryName);
        dataMap.put("enum_dict_catagory",dictCategory);
        dataMap.put("enum_list", enumInfoDefinitionList);
        generateFileByTemplate(templateName,mapperFile,dataMap);
    }

    private void generateEnumClassFile() throws Exception{
        final String suffix = "Enum.java";
        final String path = "D://" + enumClassName + suffix;
        final String templateName = "EnumClass.ftl";
        File mapperFile = new File(path);
        Map<String,Object> dataMap = new HashMap<>();
        List<EnumInfoDefinition> enumInfoDefinitionList = new ArrayList<>();
        EnumInfoDefinition enumInfoDefinition = null;
        for(int i=0;i < ENUM_INFO.length;i++){
            enumInfoDefinition = new EnumInfoDefinition();
            enumInfoDefinition.setEnumUuid(EnumGenerateUtils.generateUUID());
            enumInfoDefinition.setEnumCode(ENUM_INFO[i][0]);
            enumInfoDefinition.setEnumName(ENUM_INFO[i][1]);
            enumInfoDefinition.setEnumNumber(i + 1 + "");
            enumInfoDefinition.setEnumSortOrder(i + 1 + "");
            enumInfoDefinition.setEnumCategoryCode(enumCategoryCode);
            enumInfoDefinitionList.add(enumInfoDefinition);
        }
        dataMap.put("enum_list", enumInfoDefinitionList);
        generateFileByTemplate(templateName,mapperFile,dataMap);
    }

    private void generateFileByTemplate(final String templateName,File file,Map<String,Object> dataMap) throws Exception{
        Template template = FreeMarkerTemplateUtils.getTemplate(templateName);
        FileOutputStream fos = new FileOutputStream(file);
        dataMap.put("author",AUTHOR);
        dataMap.put("date",CURRENT_DATE);
        dataMap.put("package_name",packageName);
        dataMap.put("enum_annotation",enumAnnotation);
        dataMap.put("enum_class_name",enumClassName);
        Writer out = new BufferedWriter(new OutputStreamWriter(fos, "utf-8"),10240);
        template.process(dataMap,out);
    }

    public static String generateUUID(){
        return UUID.randomUUID().toString().replace("-", "");
    }

}

EnumClass.ftl類

package ${package_name}.enums;

/**
* 描述:${enum_annotation}類型枚舉
* @author ${author}
* @date ${date}
*/
public enum ${enum_class_name}Enum {

<#if enum_list?exists>
    <#list enum_list as enum>
    ${enum.enumCode}("${enum.enumNumber}","${enum.enumName}")<#if enum_index == ((enum_list?size) - 1)>;<#else >,</#if>
    </#list>
</#if>


    private final String code;

    private final String name;

    ${enum_class_name}Enum(String code, String name) {
        this.code = code;
        this.name = name;
    }

    public String getName() {
        return this.name;
    }

    @Override
    public String toString() {
        return this.code;
    }
}

EnumSQL.ftl類

-- ${enum_annotation}枚舉字典
<#if enum_list?exists>
    <#list enum_list as enum>
INSERT INTO "public"."sys_dict" ("id", "name", "code", "category_code", "parent_code", "sort_order", "is_updatable", "status")
VALUES ('${enum.enumUuid}', '${enum.enumName}', '${enum.enumCode}', '${enum.enumCategoryCode}', NULL, '${enum.enumSortOrder}', NULL, '1');
    </#list>
</#if>

-- ${enum_annotation}枚舉字典分類
<#if enum_dict_catagory?exists>
INSERT INTO "public"."sys_dict_category" ("id", "name", "code", "parent_code", "sort_order", "description", "is_updatable", "status")
VALUES ('${enum_dict_catagory.enumUuid}', '${enum_dict_catagory.enumCategoryName}', '${enum_dict_catagory.enumCategoryCode}', '', '0', NULL, '0', '1');
</#if>

讀書感悟

來自但丁《神曲》

  • 沒有比回憶過去的幸福更為痛苦的事了。
  • 走自己的路,讓別人說去。
  • 如果愛,請干凈地愛,把愛情獻給愛情。
  • 當一件事情愈加完美,它的痛苦和喜悅也就更多。

經典故事

【有一次和朋友去海洋館。
有個旅客問管理員說:“這只鯊魚會長多大?”
管理員指著水族箱說:“要看你的水族箱多大?!?br> 旅客又問:“會跟水族箱一樣大嗎?”
管理員仔細地說:“如果在水族箱,鯊魚只能局限在幾公尺的大小,如果在海洋,就會大到一口吞下一只獅子?!?br> 大道理:環境可以改變一個人的思想。環境能限制人的思想,人也可以限制自己的思想。不要給自己加框,無法改變環境時,就從改變自己開始?!?/p>

生活常識

運動后不宜做的六件事:

  • 不要蹲坐休息
  • 不要貪吃冷飲
  • 不要立即吃飯
  • 不要驟降體溫
  • 不要吸煙
  • 不要立即喝水

大神文章

其他

如果有帶給你一絲絲小快樂,就讓快樂繼續傳遞下去,歡迎點贊、頂、歡迎留下寶貴的意見、多謝支持!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容