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

news/2024/11/30 2:32:42/

开心一笑

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

读书感悟

来自但丁《神曲》

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

经典故事

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

生活常识

运动后不宜做的六件事:

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

大神文章

其他

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


http://www.ppmy.cn/news/543171.html

相关文章

32 《奇特的一生》 -豆瓣评分8.5

与您一起终身学习 border"0" width"330" height"86" src"//music.163.com/outchain/player?type3&id907513841&auto0&height66"> 奇特的一生 【 从认真记录每一分钟被用在了哪里开始&#xff0c;拥有高效而有意义的一…

matlab实现语音信号的频域分析及应用

1.语音信号本质上是非平稳信号。但我们可以假设语音信号在一个短时间内是平稳的&#xff0c;这样我们用稳态分析方法处理非平稳信号。应用在傅立叶分析就是短时傅立叶变换。 语音的频域分析&#xff1a;包括语音信号的频谱、功率谱、倒频谱、频谱包络等. 常用频域分析方法&am…

用尽的 resultset_永远不会再用尽分钟:在Android手机上拨打免费的VoIP电话

用尽的 resultset Android phones with Google Voice can make and receive calls at an extremely disounted rate, but you still need a voice plan to make these calls. Using Google Voice, Android, and Sipgate, you can get around that limitation and make calls fo…

世界编程语言与大学_学习新世界语言的最佳免费在线大学课程

世界编程语言与大学 Up until a few years ago, language classes cost hundreds of dollars, and came on CDs or DVDs. But now you can now learn English, Chinese, Spanish, Italian, Korean, and other languages — from top universities online, for free. 直到几年前…

程序员转行为什么这么难

尽管我在“大龄程序员的未来在何方”这篇文章里比较乐观地介绍了程序员保持竞争力的几个方向&#xff0c;但现实依然是残酷的&#xff1a;很多人将不得不离开软件开发工作&#xff0c;转型去从事其他职业。 当你要这么做时&#xff0c;就会感慨&#xff1a;想不到一切竟如此艰…

中国企业2017年数据_根据数据,2017年最好的免费在线课程

中国企业2017年数据 The results are in! In 2015, Class Central first published a ranking of the best online courses of the year based on reviews from our users. I did it again in 2016. Now I’m back with a list of the best online courses of 2017. Like last …

2022电大国家开放大学网上形考任务-中外政治思想史非免费(非答案)

中外政治思想史形成性考核一答案 【判断题】英国哲学家培根在扫清经验哲学的基础上建立了经验主义认识论哲学&#xff0c;提出了“知识就是力量”的口号。 【判断题】《和平的保卫者》是马西略政治思想的代表作。 【判断题】托马斯?阿奎那是北欧封建社会神权政治理论的最高权威…

JavaScript两大支柱-PART1:如何逃脱第七层地狱

阅读原文 在我们进入这个主题之前&#xff0c;请允许我先介绍一下我自己。我想在这结束之前&#xff0c;你可能会想知道我是谁。 我是Eric Elliott&#xff0c;《Programming JavaScript Applications》(O’Reilly)的作者&#xff0c;正篇长度的纪录片电影《编程素养》的制作主…