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

来源:互联网 发布:如何自制app软件 编辑:程序博客网 时间:2024/05/22 17:17

开心一笑

【天气热了 翻箱倒柜找了半天短袖 结果找出来一看 全是些名牌短袖 感觉穿出去太高调了 比如什么中国电信啊 天翼4G啊 太太乐鸡精啊 莲花味精啊 海天酱油啊。。最珍贵的一件 要属那件史丹利复合肥 跟刘能同款 哎头大了纠结该穿哪个好呢?穿出去不会被人说我炫富吧】

视频教程

大家好,我录制的视频《Java之优雅编程之道》已经在CSDN学院发布了,有兴趣的同学可以购买观看,相信大家一定会收获到很多知识的。谢谢大家的支持……

视频地址:http://edu.csdn.net/lecturer/994

对不起

提出问题

如何利用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>

读书感悟

来自但丁《神曲》

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

经典故事

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

生活常识

运动后不宜做的六件事:

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

大神文章

其他

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

1 0
原创粉丝点击