美文网首页互联网科技程序员
Java之利用FreeMarker引擎实现枚举和脚本自动生成

Java之利用FreeMarker引擎实现枚举和脚本自动生成

作者: 阿_毅 | 来源:发表于2017-05-08 22:38 被阅读276次

    开心一笑

    【天气热了 翻箱倒柜找了半天短袖 结果找出来一看 全是些名牌短袖 感觉穿出去太高调了 比如什么中国电信啊 天翼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>
    

    读书感悟

    来自但丁《神曲》

    • 没有比回忆过去的幸福更为痛苦的事了。
    • 走自己的路,让别人说去。
    • 如果爱,请干净地爱,把爱情献给爱情。
    • 当一件事情愈加完美,它的痛苦和喜悦也就更多。

    经典故事

    【有一次和朋友去海洋馆。
    有个旅客问管理员说:“这只鲨鱼会长多大?”
    管理员指着水族箱说:“要看你的水族箱多大。”
    旅客又问:“会跟水族箱一样大吗?”
    管理员仔细地说:“如果在水族箱,鲨鱼只能局限在几公尺的大小,如果在海洋,就会大到一口吞下一只狮子。”
    大道理:环境可以改变一个人的思想。环境能限制人的思想,人也可以限制自己的思想。不要给自己加框,无法改变环境时,就从改变自己开始。】

    生活常识

    运动后不宜做的六件事:

    • 不要蹲坐休息
    • 不要贪吃冷饮
    • 不要立即吃饭
    • 不要骤降体温
    • 不要吸烟
    • 不要立即喝水

    大神文章

    其他

    如果有带给你一丝丝小快乐,就让快乐继续传递下去,欢迎点赞、顶、欢迎留下宝贵的意见、多谢支持!

    相关文章

      网友评论

        本文标题:Java之利用FreeMarker引擎实现枚举和脚本自动生成

        本文链接:https://www.haomeiwen.com/subject/xuivtxtx.html