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

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

  1.  import groovy.sql.Sql; 
  2. /*生成java代码*/
  3. def getJavaStringBuilder={ tableName,strSQL ->
  4.     tableName=tableName.replaceAll("//.","_");
  5.     tableName=tableName.replaceAll(" ","");
  6.     strRetVal="StringBuilder strBuilder_${tableName}  = new StringBuilder(1007); /r/n"
  7.     strSQL.eachLine{        
  8.         strRetVal+="strBuilder_${tableName}.append(/" "+it+" /"); /r/n";
  9.     }
  10.     
  11.     return strRetVal;
  12. }
  13. /*
  14. 连接对象
  15. 可以根据你自己的需要调整
  16. */
  17. sql = Sql.newInstance("jdbc:oracle:thin:@10.220.51.40:1521:ORA10G","用户名","密码","oracle.jdbc.driver.OracleDriver");
  18. /* SQL语句 可以根据自己需要调整*/
  19. //strSqlTableName=this.args[0];
  20. strSqlTableName=this.args[0];
  21. //方法_获取表名
  22. strSQL="select * from  ${strSqlTableName}   where 1<>1"
  23. def file_tableName=strSqlTableName;//表名
  24. def result_columnCount=0;//列数
  25. def result_columnName=[];//列名
  26. def result_columnType=[];//列类型
  27. def result_rowsData=[];//行数据
  28. def rows_count=0;
  29. //在该脚本的同级目录下生成已表名命名的csv文件
  30. file_csv= new File("${file_tableName}.sql");
  31. //判断文件是否存在,如果存在写删除
  32. if(file_csv.exists()){
  33. println "在当前目录下发现已经存在${file_tableName},程序已经删除文件"
  34.     file_csv.delete()
  35. }
  36. println "准备生成${file_tableName}.csv"
  37. sql.eachRow(strSQL,
  38.     {
  39.         result_columnCount= it.getColumnCount();        
  40.         
  41.         println "*********${file_tableName}表结构**********"
  42.         println ":本次导出共生成${result_columnCount}个字段";
  43.         for (i in 1..result_columnCount){  //不同与java,groovy下标从1开始          
  44.             println    it.getColumnName(i) +"   |    "+ it.getColumnTypeName(i) ;   
  45.             result_columnName<<it.getColumnName(i);
  46.             result_columnType<<it.getColumnTypeName(i);           
  47.         }
  48.         println "*********${file_tableName}表结构**********"
  49.       //  file_csv<<result_columnName.join(",")+System.getProperty("line.separator"); 
  50.         
  51.         println "开始生成数据,请耐心等待......"
  52.     },
  53.     {
  54.         
  55.     
  56.     }    
  57. );
  58. /*生成 select 语句*/
  59. file_csv << " -- SELECT 语句 /r/n"
  60. strTemp="SELECT /r/n${result_columnName.join(',/r/n')}/r/nFROM/r/n${strSqlTableName}"
  61. file_csv << strTemp+"/r/n/r/n/r/n"
  62. file_csv << " -- SELECT java 语句 /r/n"
  63. file_csv << getJavaStringBuilder(file_tableName,strTemp);
  64. file_csv << "/r/n/r/n/r/n"
  65. /*生成insert 语句*/
  66. file_csv << " -- INSERT 语句 /r/n"
  67. strTemp="INSERT INTO ${strSqlTableName}/r/n(/r/n${result_columnName.join(',/r/n')}/r/nVALUES(/r/n${result_columnType.join(',/r/n')}/r/n)";
  68. file_csv << strTemp+"/r/n/r/n/r/n"
  69. file_csv << " -- INSERT java 语句 /r/n"
  70. file_csv << getJavaStringBuilder(file_tableName,strTemp);
  71. file_csv << "/r/n/r/n/r/n"
  72. 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.  -- SELECT java 语句 
  29. StringBuilder strBuilder_WI_WARNING_RESULT  = new StringBuilder(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. INSERT INTO WI.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.  -- INSERT java 语句 
  108. StringBuilder strBuilder_WI_WARNING_RESULT  = new StringBuilder(1007); 
  109. strBuilder_WI_WARNING_RESULT.append(" INSERT INTO WI.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. void sql2Java()
  2. {
  3.     StringBuilder sb=new StringBuilder(1007);
  4.     String line=textArea.getSelectedText();
  5.     
  6.    String[] strArray=  line.split("/n");
  7.    
  8.    sb.append(" StringBuilder sb=new StringBuilder(1007);  /n");
  9.    for (int i=0;i<strArray.length;i++)
  10.     {
  11.     sb.append(" sb.append(/"  "+strArray[i]+"  /"); /n");   
  12.        
  13.     }
  14.     
  15.    
  16.     textArea.setSelectedText(sb.toString());
  17.     
  18. }
  19. if(buffer.isReadOnly())
  20.     Macros.error(view, "Buffer is read-only.");
  21. else
  22.     sql2Java();

 

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

如:原始的 sql如

 

 

当我使用宏脚本后

 

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

时间: 2024-09-19 12:19:48

写些小工具来帮助工作更有效率的相关文章

Seo主管应该怎么管理才能让工作更有效率

每个seo服务公司都会有一个领导核心,也就是所谓的seo主管,一个seoer在公司做得久了,有经验了,自然也能升为一个seo主管.但是Seo主管并不好做,他往往是整个seo工作的核心所在,对整个seo工作成败有着至关重要的作用. Seo主管的工作就是统筹大局,领导每一位seo下属去有条理的工作,但是如何让下属工作更有效率一直是seo主管们的难题,笔者也曾当过seo主管,对这个问题也有一定的理解和研究了,下面就分部门来分享一下笔者是如何通过合理的管理让这些部门的下属工作更有效率吧.   第一:网站

Seo主管如何通过合理的管理让下属工作更有效率

摘要: 每个seo服务公司都会有一个领导核心,也就是所谓的seo主管,一个seoer在公司做得久了,有经验了,自然也能升为一个seo主管.但是Seo主管并不好做,他往往是整个seo工作的核心所在, 每个seo服务公司都会有一个领导核心,也就是所谓的seo主管,一个seoer在公司做得久了,有经验了,自然也能升为一个seo主管.但是Seo主管并不好做,他往往是整个seo工作的核心所在,对整个seo工作成败有着至关重要的作用. Seo主管的工作就是统筹大局,领导每一位seo下属去有条理的工作,但是如

设计流程工具化是工作更高效

早期的的时候,电商用户体验设计部的设计管理是通过各leader跟产品经理收集和手工排需求的形式,但是随着产品需求的迅速的增长,紧跟着团队不断扩大,每一周的设计需求从每周几十单快速的增到几百单,部门顺应组建设计管理组,聚焦在流程和项目如何能更加高效,今日就跟大家分享其中的工具化心得. 早期的设计部门的流程是这样的,产品经理写出一个设计需求的文档,汇总多个需求到一个填写规范的表格在每周统一时间写给设计排期人(一般是leader,也有的是专门的项目PM)排期人拿到表格后在另外一份排期表格上填写各类需求

Python写黑客小工具,360免杀

构思: client:反向连接server,执行shell命令 server:发送命令,控制客户端 import subprocess import socket import threading target="172.22.40.41" port=55555 buffer="" def sendMag(c_socket): global buffer while True: #send cmd if len(buffer): try: print "c

Bossy智能便贴:让工作更有效率

     物联网正以星际迷航里博格人那样极高的效率,迅速进军计步器.烟雾警报器,以及酒吧器具等市场.目前,来自巴西一个设计专业的学生 Lucas Neumann de Antonio 选择了一个看似不起眼的市场--便利贴.他设想了一个叫做Bossy的效率工具,为传统的纸质便条加入互联网体验. Bossy看起来就像是Nest的恒温器被从墙上扯下来放到了桌子上,它可以从一些任务管理软件(如Omnifocus.Wunderlist.Asana或者日历.邮件以及其他一些专注特定任务的定制软件)中获取任务

C++写小工具,标题一定要长过15个字

问题描述 C++写小工具,标题一定要长过15个字 请问下用C++写exe小工具,怎么让小工具占磁盘空间小,又能够不依赖运行库呢?网上下载的小工具都只有10多k,而我用mfc静态编译出来的小工具高达3mb,不用静态编译又会依赖运行库请问如何是好? 解决方案 MFC,肯定大的,你选标准windows 的就小很多: 解决方案二: MFC,肯定大的,你选标准windows 的就小很多:

利用Python实现颜色色值转换的小工具_python

先看看Zeplin 的颜色色值显示示例 原有处理方式 因为我会 Python (仅限于终端输入 python 然后当做计算器算,或者用 hex() 函数把十进制转换成十六进制),所以遇到这样的问题我当然是采用python 的 hex() 函数做转换,然后手动结果输入到 Android Studio 中. 采用 hex 函数手动转换色值 动机 人总是懒得,想要写这个小工具已经很久了,我也打过有过构思就是:      输入: 类似 RGB 的十进制值(110, 122 138),用空格或者逗号分割一

Python 实现一个颜色色值转换的小工具_python

需求说明 公司的 UI 设计小哥,已经转用 Zeplin 很久了.Zeplin 的设计稿展示页面的颜色色值使用十进制的 RGB 表示的,在 Android 中的颜色表示大多情况下都需要十六进制的 RGB 表示.我的数学没有好到直接看到十进制就可以心算得到十六进制的结果,所以我需要一个工具,输入十进制的 RGB ,得到十六进制的色值,最好可以方便复制.  Zeplin 的颜色色值显示示例 原有处理方式 因为我会 Python (仅限于终端输入 python 然后当做计算器算,或者用 hex() 函

Win7打开与禁用系统桌面小工具设置方法

  1.在Win7桌面空间处单击右键,在弹出菜单中选择小工具. 2.在需要添加的小工具上单击右键,选择添加,比如小工具<幻灯片放映>还是挺有特色的,选择添加后此工具就会出现在win7的右侧桌面. 3.在右侧刚刚添加的幻灯片小工具上单击右键,点击"选择",在这里可定义需要在右上角播放的图片目录,以及每张图片的显示时间. 4.便签小工具也不错,win7家庭版没有集成便签工具,一直是用这个工具在电脑记杂事,用第三步的方式添加. 5.小工具使用过程中,如果觉得小工具妨碍了工作,可在