加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-14 16:58:55 所属栏目:大数据 来源:网络整理
导读:?? 看到同事痛苦的拼写SQL语句并转化成java String语句,自己不仅感到汗言,说实话过于复杂的SQL语句要换成我也未必会拼写的好.而且如果每个表都采用手工去拼写且转化的话,熟练的开发人员可能要5到10分钟,不熟悉的可能要更长的时间这样是很浪费时间的.很久以前
?? 看到同事痛苦的拼写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. VARCHAR2,
  87. VARCHAR2,
  88. DATE,
  89. NUMBER
  90. )
  91. ?--?INSERT?java?语句?
  92. StringBuilder?strBuilder_WI_WARNING_RESULT??=?new?StringBuilder(1007);?
  93. strBuilder_WI_WARNING_RESULT.append("?INSERT?INTO?WI.WARNING_RESULT?");?
  94. strBuilder_WI_WARNING_RESULT.append("?(?");?
  95. strBuilder_WI_WARNING_RESULT.append("?C_SERIAL,?");?
  96. strBuilder_WI_WARNING_RESULT.append("?C_MONTH_ID,?");?
  97. strBuilder_WI_WARNING_RESULT.append("?C_AREA_ID,?");?
  98. strBuilder_WI_WARNING_RESULT.append("?WARNING_ID,?");?
  99. strBuilder_WI_WARNING_RESULT.append("?WARNING_ID_DESC,?");?
  100. strBuilder_WI_WARNING_RESULT.append("?WARNING_LEVEL,?");?
  101. strBuilder_WI_WARNING_RESULT.append("?WARNING_LEVEL_DESC,?");?
  102. strBuilder_WI_WARNING_RESULT.append("?WARNING_OBJECT,?");?
  103. strBuilder_WI_WARNING_RESULT.append("?WARNING_OBJECT_DESC,?");?
  104. strBuilder_WI_WARNING_RESULT.append("?REFERENCE_VALUE_TYP,?");?
  105. strBuilder_WI_WARNING_RESULT.append("?REFERENCE_VALUE_TYP_DESC,?");?
  106. strBuilder_WI_WARNING_RESULT.append("?WARNING_VALUE_TYP,?");?
  107. strBuilder_WI_WARNING_RESULT.append("?WARNING_VALUE_TYP_DESC,?");?
  108. strBuilder_WI_WARNING_RESULT.append("?ACTUAL_VALUE,?");?
  109. strBuilder_WI_WARNING_RESULT.append("?REFERENCE_VALUE,?");?
  110. strBuilder_WI_WARNING_RESULT.append("?WARNING_VALUE,?");?
  111. strBuilder_WI_WARNING_RESULT.append("?VALUE_UP,?");?
  112. strBuilder_WI_WARNING_RESULT.append("?VALUE_DOWN,?");?
  113. strBuilder_WI_WARNING_RESULT.append("?IS_WARNING_DESC,?");?
  114. strBuilder_WI_WARNING_RESULT.append("?IS_GIS_SHOW,?");?
  115. strBuilder_WI_WARNING_RESULT.append("?CREATE_TIME,?");?
  116. strBuilder_WI_WARNING_RESULT.append("?ID,?");?
  117. strBuilder_WI_WARNING_RESULT.append("?VERSION?");?
  118. strBuilder_WI_WARNING_RESULT.append("?VALUES(?");?
  119. strBuilder_WI_WARNING_RESULT.append("?NUMBER,?");?
  120. strBuilder_WI_WARNING_RESULT.append("?NUMBER,?");?
  121. strBuilder_WI_WARNING_RESULT.append("?NUMBER,?");?
  122. strBuilder_WI_WARNING_RESULT.append("?VARCHAR2,?");?
  123. strBuilder_WI_WARNING_RESULT.append("?VARCHAR2,?");?
  124. strBuilder_WI_WARNING_RESULT.append("?DATE,?");?
  125. strBuilder_WI_WARNING_RESULT.append("?NUMBER?");?
  126. 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如

?

?

当我使用宏脚本后

?

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读