`
touchmm
  • 浏览: 1055253 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

写些小工具来帮助工作更有效率

阅读更多
看到同事痛苦的拼写SQL语句并转化成java String语句,自己不仅感到汗言,说实话过于复杂的SQL语句要换成我也未必会拼写的好.而且如果每个表都采用手工去拼写且转化的话,熟练的开发人员可能要5到10分钟,不熟悉的可能要更长的时间这样是很浪费时间的.很久以前我就写过类似的工具可以见我系列文章<自己动手编写DB2小工具>.
既然自己喜欢groovy,于是花了10来分钟写了个简单的根据表名自动生成 SQL语句的小脚本.这样只要输入表名就可以得到这个表的select\insert语句以及对应的java代码.

groovy脚本 run.groovy
  1. importgroovy.sql.Sql;
  2. /*生成java代码*/
  3. defgetJavaStringBuilder={tableName,strSQL->
  4. tableName=tableName.replaceAll("\\.","_");
  5. tableName=tableName.replaceAll("","");
  6. strRetVal="StringBuilderstrBuilder_${tableName}=newStringBuilder(1007);\r\n"
  7. strSQL.eachLine{
  8. strRetVal+="strBuilder_${tableName}.append(\""+it+"\");\r\n";
  9. }
  10. returnstrRetVal;
  11. }
  12. /*
  13. 连接对象
  14. 可以根据你自己的需要调整
  15. */
  16. sql=Sql.newInstance("jdbc:oracle:thin:@10.220.51.40:1521:ORA10G","用户名","密码","oracle.jdbc.driver.OracleDriver");
  17. /*SQL语句可以根据自己需要调整*/
  18. //strSqlTableName=this.args[0];
  19. strSqlTableName=this.args[0];
  20. //方法_获取表名
  21. strSQL="select*from${strSqlTableName}where1<>1"
  22. deffile_tableName=strSqlTableName;//表名
  23. defresult_columnCount=0;//列数
  24. defresult_columnName=[];//列名
  25. defresult_columnType=[];//列类型
  26. defresult_rowsData=[];//行数据
  27. defrows_count=0;
  28. //在该脚本的同级目录下生成已表名命名的csv文件
  29. file_csv=newFile("${file_tableName}.sql");
  30. //判断文件是否存在,如果存在写删除
  31. if(file_csv.exists()){
  32. println"在当前目录下发现已经存在${file_tableName},程序已经删除文件"
  33. file_csv.delete()
  34. }
  35. println"准备生成${file_tableName}.csv"
  36. sql.eachRow(strSQL,
  37. {
  38. result_columnCount=it.getColumnCount();
  39. println"*********${file_tableName}表结构**********"
  40. println":本次导出共生成${result_columnCount}个字段";
  41. for(iin1..result_columnCount){//不同与java,groovy下标从1开始
  42. printlnit.getColumnName(i)+"|"+it.getColumnTypeName(i);
  43. result_columnName<<it.getColumnName(i);
  44. result_columnType<<it.getColumnTypeName(i);
  45. }
  46. println"*********${file_tableName}表结构**********"
  47. //file_csv<<result_columnName.join(",")+System.getProperty("line.separator");
  48. println"开始生成数据,请耐心等待......"
  49. },
  50. {
  51. }
  52. );
  53. /*生成select语句*/
  54. file_csv<<"--SELECT语句\r\n"
  55. strTemp="SELECT\r\n${result_columnName.join(',\r\n')}\r\nFROM\r\n${strSqlTableName}"
  56. file_csv<<strTemp+"\r\n\r\n\r\n"
  57. file_csv<<"--SELECTjava语句\r\n"
  58. file_csv<<getJavaStringBuilder(file_tableName,strTemp);
  59. file_csv<<"\r\n\r\n\r\n"
  60. /*生成insert语句*/
  61. file_csv<<"--INSERT语句\r\n"
  62. strTemp="INSERTINTO${strSqlTableName}\r\n(\r\n${result_columnName.join(',\r\n')}\r\nVALUES(\r\n${result_columnType.join(',\r\n')}\r\n)";
  63. file_csv<<strTemp+"\r\n\r\n\r\n"
  64. file_csv<<"--INSERTjava语句\r\n"
  65. file_csv<<getJavaStringBuilder(file_tableName,strTemp);
  66. file_csv<<"\r\n\r\n\r\n"
  67. println"结束"


接着就是如何使用这个脚本了,只要调用的时候加上你要查询的表明即可 如: groovy run.groovy [表名]
那么在当前目录下就会自动生成一个[表名].sql文件里面就有select \ insert语句

使用的时候如图:






最后在当前目录下就会生成一个[表名].sql文件

内容如下:

  1. --SELECT语句
  2. SELECT
  3. C_SERIAL,
  4. C_MONTH_ID,
  5. C_AREA_ID,
  6. WARNING_ID,
  7. WARNING_ID_DESC,
  8. WARNING_LEVEL,
  9. WARNING_LEVEL_DESC,
  10. WARNING_OBJECT,
  11. WARNING_OBJECT_DESC,
  12. REFERENCE_VALUE_TYP,
  13. REFERENCE_VALUE_TYP_DESC,
  14. WARNING_VALUE_TYP,
  15. WARNING_VALUE_TYP_DESC,
  16. ACTUAL_VALUE,
  17. REFERENCE_VALUE,
  18. WARNING_VALUE,
  19. VALUE_UP,
  20. VALUE_DOWN,
  21. IS_WARNING_DESC,
  22. IS_GIS_SHOW,
  23. CREATE_TIME,
  24. ID,
  25. VERSION
  26. FROM
  27. WI.WARNING_RESULT
  28. --SELECTjava语句
  29. StringBuilderstrBuilder_WI_WARNING_RESULT=newStringBuilder(1007);
  30. strBuilder_WI_WARNING_RESULT.append("SELECT");
  31. strBuilder_WI_WARNING_RESULT.append("C_SERIAL,");
  32. strBuilder_WI_WARNING_RESULT.append("C_MONTH_ID,");
  33. strBuilder_WI_WARNING_RESULT.append("C_AREA_ID,");
  34. strBuilder_WI_WARNING_RESULT.append("WARNING_ID,");
  35. strBuilder_WI_WARNING_RESULT.append("WARNING_ID_DESC,");
  36. strBuilder_WI_WARNING_RESULT.append("WARNING_LEVEL,");
  37. strBuilder_WI_WARNING_RESULT.append("WARNING_LEVEL_DESC,");
  38. strBuilder_WI_WARNING_RESULT.append("WARNING_OBJECT,");
  39. strBuilder_WI_WARNING_RESULT.append("WARNING_OBJECT_DESC,");
  40. strBuilder_WI_WARNING_RESULT.append("REFERENCE_VALUE_TYP,");
  41. strBuilder_WI_WARNING_RESULT.append("REFERENCE_VALUE_TYP_DESC,");
  42. strBuilder_WI_WARNING_RESULT.append("WARNING_VALUE_TYP,");
  43. strBuilder_WI_WARNING_RESULT.append("WARNING_VALUE_TYP_DESC,");
  44. strBuilder_WI_WARNING_RESULT.append("ACTUAL_VALUE,");
  45. strBuilder_WI_WARNING_RESULT.append("REFERENCE_VALUE,");
  46. strBuilder_WI_WARNING_RESULT.append("WARNING_VALUE,");
  47. strBuilder_WI_WARNING_RESULT.append("VALUE_UP,");
  48. strBuilder_WI_WARNING_RESULT.append("VALUE_DOWN,");
  49. strBuilder_WI_WARNING_RESULT.append("IS_WARNING_DESC,");
  50. strBuilder_WI_WARNING_RESULT.append("IS_GIS_SHOW,");
  51. strBuilder_WI_WARNING_RESULT.append("CREATE_TIME,");
  52. strBuilder_WI_WARNING_RESULT.append("ID,");
  53. strBuilder_WI_WARNING_RESULT.append("VERSION");
  54. strBuilder_WI_WARNING_RESULT.append("FROM");
  55. strBuilder_WI_WARNING_RESULT.append("WI.WARNING_RESULT");
  56. --INSERT语句
  57. INSERTINTOWI.WARNING_RESULT
  58. (
  59. C_SERIAL,
  60. C_MONTH_ID,
  61. C_AREA_ID,
  62. WARNING_ID,
  63. WARNING_ID_DESC,
  64. WARNING_LEVEL,
  65. WARNING_LEVEL_DESC,
  66. WARNING_OBJECT,
  67. WARNING_OBJECT_DESC,
  68. REFERENCE_VALUE_TYP,
  69. REFERENCE_VALUE_TYP_DESC,
  70. WARNING_VALUE_TYP,
  71. WARNING_VALUE_TYP_DESC,
  72. ACTUAL_VALUE,
  73. REFERENCE_VALUE,
  74. WARNING_VALUE,
  75. VALUE_UP,
  76. VALUE_DOWN,
  77. IS_WARNING_DESC,
  78. IS_GIS_SHOW,
  79. CREATE_TIME,
  80. ID,
  81. VERSION
  82. VALUES(
  83. NUMBER,
  84. NUMBER,
  85. NUMBER,
  86. NUMBER,
  87. VARCHAR2,
  88. NUMBER,
  89. VARCHAR2,
  90. VARCHAR2,
  91. VARCHAR2,
  92. NUMBER,
  93. VARCHAR2,
  94. NUMBER,
  95. VARCHAR2,
  96. NUMBER,
  97. NUMBER,
  98. NUMBER,
  99. NUMBER,
  100. NUMBER,
  101. VARCHAR2,
  102. NUMBER,
  103. DATE,
  104. NUMBER,
  105. NUMBER
  106. )
  107. --INSERTjava语句
  108. StringBuilderstrBuilder_WI_WARNING_RESULT=newStringBuilder(1007);
  109. strBuilder_WI_WARNING_RESULT.append("INSERTINTOWI.WARNING_RESULT");
  110. strBuilder_WI_WARNING_RESULT.append("(");
  111. strBuilder_WI_WARNING_RESULT.append("C_SERIAL,");
  112. strBuilder_WI_WARNING_RESULT.append("C_MONTH_ID,");
  113. strBuilder_WI_WARNING_RESULT.append("C_AREA_ID,");
  114. strBuilder_WI_WARNING_RESULT.append("WARNING_ID,");
  115. strBuilder_WI_WARNING_RESULT.append("WARNING_ID_DESC,");
  116. strBuilder_WI_WARNING_RESULT.append("WARNING_LEVEL,");
  117. strBuilder_WI_WARNING_RESULT.append("WARNING_LEVEL_DESC,");
  118. strBuilder_WI_WARNING_RESULT.append("WARNING_OBJECT,");
  119. strBuilder_WI_WARNING_RESULT.append("WARNING_OBJECT_DESC,");
  120. strBuilder_WI_WARNING_RESULT.append("REFERENCE_VALUE_TYP,");
  121. strBuilder_WI_WARNING_RESULT.append("REFERENCE_VALUE_TYP_DESC,");
  122. strBuilder_WI_WARNING_RESULT.append("WARNING_VALUE_TYP,");
  123. strBuilder_WI_WARNING_RESULT.append("WARNING_VALUE_TYP_DESC,");
  124. strBuilder_WI_WARNING_RESULT.append("ACTUAL_VALUE,");
  125. strBuilder_WI_WARNING_RESULT.append("REFERENCE_VALUE,");
  126. strBuilder_WI_WARNING_RESULT.append("WARNING_VALUE,");
  127. strBuilder_WI_WARNING_RESULT.append("VALUE_UP,");
  128. strBuilder_WI_WARNING_RESULT.append("VALUE_DOWN,");
  129. strBuilder_WI_WARNING_RESULT.append("IS_WARNING_DESC,");
  130. strBuilder_WI_WARNING_RESULT.append("IS_GIS_SHOW,");
  131. strBuilder_WI_WARNING_RESULT.append("CREATE_TIME,");
  132. strBuilder_WI_WARNING_RESULT.append("ID,");
  133. strBuilder_WI_WARNING_RESULT.append("VERSION");
  134. strBuilder_WI_WARNING_RESULT.append("VALUES(");
  135. strBuilder_WI_WARNING_RESULT.append("NUMBER,");
  136. strBuilder_WI_WARNING_RESULT.append("NUMBER,");
  137. strBuilder_WI_WARNING_RESULT.append("NUMBER,");
  138. strBuilder_WI_WARNING_RESULT.append("NUMBER,");
  139. strBuilder_WI_WARNING_RESULT.append("VARCHAR2,");
  140. strBuilder_WI_WARNING_RESULT.append("NUMBER,");
  141. strBuilder_WI_WARNING_RESULT.append("VARCHAR2,");
  142. strBuilder_WI_WARNING_RESULT.append("VARCHAR2,");
  143. strBuilder_WI_WARNING_RESULT.append("VARCHAR2,");
  144. strBuilder_WI_WARNING_RESULT.append("NUMBER,");
  145. strBuilder_WI_WARNING_RESULT.append("VARCHAR2,");
  146. strBuilder_WI_WARNING_RESULT.append("NUMBER,");
  147. strBuilder_WI_WARNING_RESULT.append("VARCHAR2,");
  148. strBuilder_WI_WARNING_RESULT.append("NUMBER,");
  149. strBuilder_WI_WARNING_RESULT.append("NUMBER,");
  150. strBuilder_WI_WARNING_RESULT.append("NUMBER,");
  151. strBuilder_WI_WARNING_RESULT.append("NUMBER,");
  152. strBuilder_WI_WARNING_RESULT.append("NUMBER,");
  153. strBuilder_WI_WARNING_RESULT.append("VARCHAR2,");
  154. strBuilder_WI_WARNING_RESULT.append("NUMBER,");
  155. strBuilder_WI_WARNING_RESULT.append("DATE,");
  156. strBuilder_WI_WARNING_RESULT.append("NUMBER,");
  157. strBuilder_WI_WARNING_RESULT.append("NUMBER");
  158. strBuilder_WI_WARNING_RESULT.append(")");

这样基本上改改就可以拿来用了,当然关键是这一切都只是瞬间就自动完成的事情.

或许你还是会觉得这样的脚本不够灵活,另外我喜欢用JEDIT这个编辑器的缘故,所以我也为这个编辑器写过一个宏脚本.

也是完成同样的事情,不同的是我可以写编写好我要的SQL语句,然后同过这个宏自动生成java代码.

JEDIT 宏脚本

  1. voidsql2Java()
  2. {
  3. StringBuildersb=newStringBuilder(1007);
  4. Stringline=textArea.getSelectedText();
  5. String[]strArray=line.split("\n");
  6. sb.append("StringBuildersb=newStringBuilder(1007);\n");
  7. for(inti=0;i<strArray.length;i++)
  8. {
  9. sb.append("sb.append(\""+strArray[i]+"\");\n");
  10. }
  11. textArea.setSelectedText(sb.toString());
  12. }
  13. if(buffer.isReadOnly())
  14. Macros.error(view,"Bufferisread-only.");
  15. else
  16. sql2Java();

然后我调节了一下JEDIT,吧这个脚本放到了编辑区域的右击鼠标菜单上,只要我编辑好sql语句,在点右击鼠标菜单既可使用这个装换的功能

如:原始的sql如

当我使用宏脚本后

这样原本就不复杂的事情就变得更加简单和高效了.

分享到:
评论

相关推荐

    让自己的工作更有效率

    标题“让自己的工作更有效率”暗示了这篇博文可能探讨的是如何通过技术手段或工具来提升个人工作效率。虽然描述部分为空,但从标签“源码”和“工具”我们可以推测,内容可能涉及编程语言、开发环境、项目管理或者...

    常用单片机小工具:波特率计算,串口工具

    从波特率计算以确保准确的串行通信,到串口工具帮助调试和测试,再到电阻色环计算辅助硬件识别,以及定时器初值计算保证程序的实时性,每个环节都对项目成功起着关键作用。熟练掌握并运用这些工具和计算方法,将极大...

    Windows 10 CPU使用率显示小工具

    总的来说,"Windows 10 CPU使用率显示小工具"是一个实用的系统监控工具,能够有效地帮助用户监控和优化计算机性能。通过实时显示CPU和内存的使用情况,以及窗口置顶功能,使得系统管理变得更加直观和便捷。在日常...

    Win7桌面小工具

    总的来说,Windows 7的桌面小工具是提升工作效率、个性化桌面和日常便利性的有效工具集合,它们以直观的方式呈现信息,简化了用户的操作流程。然而,随着技术的发展,现代操作系统趋向于集成更先进、功能更强大的...

    内存使用率查看小工具

    内存使用率查看小工具是一种简洁而实用的应用程序,专门设计用于帮助用户实时监控和了解计算机系统的内存使用情况。在日常的计算机操作中,了解内存的使用状况对于优化系统性能、防止资源浪费以及诊断潜在问题至关...

    win7桌面小工具合集

    使用这些桌面小工具,用户可以更有效地管理自己的电脑资源,及时发现并解决问题。例如,当CPU使用率过高时,可能是因为运行了占用资源过多的应用程序,此时用户可以关闭不必要的程序或者优化设置来释放资源。另外,...

    快速检测升级小板工具

    在IT行业中,硬件升级是提升计算机性能...对于个人用户和专业技术人员来说,这样的工具都是提高效率、保障设备稳定运行的有效手段。通过使用这个工具,用户可以在升级前对硬件进行预判,从而更好地规划和执行升级计划。

    CPU性能占用率记录工具VB

    值得一提的是,“自写小工具”这一描述表明,该CPU性能占用率记录工具并非来自大型软件公司开发的商业化产品,而是由个人或小型团队根据自己的需求定制开发的解决方案。这使得该工具具有较高的灵活性和可定制性,它...

    3个串口调试工具以及两个波特率计算工具

    在IT领域,串口调试和波特率计算是..."两个波特率计算工具"则可能提供两种不同方式来计算和验证波特率,帮助用户确保设备之间的串行通信顺畅无误。在实际工作中,选择合适的工具能有效提升工作效率,解决串口通信问题。

    测试覆盖率工具

    在本文中,我们将深入探讨测试覆盖率的概念、类型、常用的测试覆盖率工具以及如何有效地利用这些工具来提升软件质量。 首先,我们需要理解什么是测试覆盖率。测试覆盖率是衡量测试用例对源代码执行程度的一个度量,...

    iOS android 有效代码 注释率 工具

    本文将深入探讨如何利用给定的工具来统计iOS和Android项目中的注释率以及有效代码行数。 首先,我们要了解什么是有效代码。有效代码通常指的是能够被执行或对程序逻辑有直接影响的代码,例如函数定义、变量声明、...

    WinCE系统端口波特率测试工具

    通过这个工具,开发人员和系统管理员能够更有效地调试和优化WinCE设备的串行通信,确保其在各种波特率设置下都能稳定工作。这对于依赖串口通信的设备,如遥测设备、自动化设备或数据采集系统,尤为重要。

    凯立德地图波特率修改工具

    这个文件可能是开发者提供的定制工具或其他辅助资源,用于帮助用户更好地完成操作。接下来,按照工具界面提供的操作指南,用户首先点击“打开”按钮,并在凯立德导航系统的根目录下找到NaviResFile文件夹,这个...

    CPU占用率测试工具

    CPU占用率测试工具是计算机性能分析中不可或缺的一部分,...它们能够帮助我们有效地分析和优化计算机性能,确保系统运行流畅,提高工作效率。正确地使用这些工具,不仅可以提升个人技能,也是保障系统稳定运行的关键。

    UDP 丢包率测试工具

    UDP(User Datagram Protocol)是一种无连接的传输层协议,它提供了...综上所述,UDP丢包率测试工具通过UDP Socket通信机制,提供了一种简单而有效的评估网络丢包状况的方法,对于网络性能的调试和优化具有重要意义。

    网络流量实时统计小工具

    本文将深入探讨“网络流量实时统计小工具”这一实用软件,帮助读者了解其功能、使用方法以及在实际应用中的价值。 网络流量实时统计小工具,正如其名,是一款专注于网络流量监控的轻量级应用程序。它可以实时地显示...

    windows平台下C/C++代码覆盖率检查工具

    2. **LLVM/Clang的LCov**: LCov是一款通用的代码覆盖率工具,它可以与GCC和LLVM/Clang一起工作。在Windows上,你可以安装LLVM和LCov,然后使用类似Gcov的步骤进行配置和运行。LCov提供更友好的报告格式,并且可以...

    凯立德GPS导航端口及波特率检测工具最新2018

    2. 检测波特率:通过尝试不同波特率,工具可以帮助用户确定最适合的波特率设置,避免手动逐个测试的繁琐过程。 3. 显示结果:检测完成后,工具会清晰地显示检测到的端口和波特率信息,用户可以直接参考这些信息进行...

    QTP测试辅助小工具

    **QTP测试辅助小工具详解** QTP,全称QuickTest Professional,是由HP(现为Micro Focus)公司推出的一种功能...对于任何从事QTP测试的人员来说,掌握并合理利用这类辅助工具,无疑能有效提升其专业技能和工作效率。

    WebSocket测试小工具

    WebSocket测试小工具是一款专...总的来说,WebSocket测试小工具是开发和调试WebSocket服务不可或缺的辅助工具,结合AutoIt3的自动化能力,可以有效地提升测试效率,确保WebSocket应用在上线前达到预期的稳定性和性能。

Global site tag (gtag.js) - Google Analytics