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

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

使用的时候如图:



写些小工具来帮助工作更有效率_第1张图片


最后在当前目录下就会生成一个[表名].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如

写些小工具来帮助工作更有效率_第2张图片

当我使用宏脚本后

写些小工具来帮助工作更有效率_第3张图片

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

你可能感兴趣的:(sql,工作,C#,脚本,groovy)