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

Posted zhangjianying

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了写些小工具来帮助工作更有效率相关的知识,希望对你有一定的参考价值。

   看到同事痛苦的拼写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如

 

 

当我使用宏脚本后

 

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

以上是关于写些小工具来帮助工作更有效率的主要内容,如果未能解决你的问题,请参考以下文章

有哪些可以极大提高工作效率的办公神器值得推荐?

小程序天气工具怎么描述使用场景更容易通过位置接口的申请

写python的常用工具及设置

更效率、更优雅 阿里巴巴开发者工具不完全盘点

常用的自媒体工具有哪些?干货分享!

太强了!Python 开发桌面小工具,让代码替我们干重复的工作-