接口测试平台:支持SQL语句执行(Mysql、Oracle)(旧版已废弃)

叁歲伎倆 2023-06-24 11:26 62阅读 0赞

SQL的使用,主要有以下两个模块:
1.数据库配置
在这里插入图片描述
2.case管理与执行
在这里插入图片描述
数据库管理这一块,无外乎简单的增删改查,主要是为了保存数据库信息,在此不做过多展开。
在这里插入图片描述
然后是case的管理:
在这里插入图片描述
case结构比较简单,主要是两块:
1.sql的基础信息,包含所用数据库、case名称、sql语句及备注信息
2.需要保存的变量、返回结果。需要保存的变量这一块,同样支持jsonPath和正则两种方式(后端将返回的表格转换为了JsonArray的形式,所以也支持jsonPath)。
对应的bean文件如下:

  1. public class SqlCase {
  2. /** 主键id */
  3. private int id;
  4. /** 创建人 */
  5. private String createrName;
  6. /** 创建人code */
  7. private String createrCode;
  8. /** 创建时间 */
  9. @JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd")
  10. private Date createDate;
  11. /** case名 */
  12. private String caseName;
  13. /** 数据库名 */
  14. private String databaseName;
  15. /** 数据库id */
  16. private Integer databaseId;
  17. /** sql语句 */
  18. private String sql;
  19. /** 描述 */
  20. private String description;
  21. /** 需要保存的变量 */
  22. private String variableListValue;
  23. private List<VariableSave> variableList;
  24. /** 响应结果 */
  25. private String result;
  26. }

case的管理本身也是增删改查,就不做拓展了。主要是讲解一下sql执行这一块的代码。
Service层:

  1. public ResponseVo excuteSqlRequest(SqlCase sqlCase) {
  2. ResponseVo responseVo = new ResponseVo();
  3. // 获取数据库配置信息
  4. DataBase dataBase = apiTestConfigMapper.selectDataBaseById(sqlCase.getDatabaseId());
  5. dataBase.setSql(sqlCase.getSql());
  6. // Sql执行
  7. String result = ApiTestUtils.doSqlRequest(dataBase);
  8. sqlCase.setResult(result);
  9. // 保存变量
  10. ApiTestUtils.saveVariable(result, sqlCase.getVariableListValue(), ApiTestConfig.GLOBAL_COLLECTION_ID);
  11. // 更新数据库保存的信息
  12. sqlCaseMapper.updateSqlCase(sqlCase);
  13. // 将执行后的结果返回给前端
  14. responseVo.setIsSuccess(Boolean.TRUE);
  15. responseVo.setResult(sqlCase);
  16. return responseVo;
  17. }

DataBase Bean

  1. public class DataBase {
  2. private Integer id;
  3. private String dbName;
  4. private String url;
  5. private String username;
  6. private String password;
  7. /** sql语句,只做执行使用 */
  8. private String sql;
  9. private String description;
  10. /**
  11. * 数据库类型
  12. * 1:mysql 2:oracle
  13. */
  14. private Integer databaseType;
  15. }

ApiTestUtils.doSqlRequest
这一块函数,入参是一个数据库信息(包含要执行的sql语句),然后通过databaseType字段值判断是mysql数据库还是oracle数据库。然后通过正则表达式去判断要执行的语句类型,如果是select则返回查询结果,是其他操作则返回操作状态。

  1. public static String doSqlRequest(DataBase dataBase){
  2. String sql = dataBase.getSql();
  3. String url = "";
  4. Integer databaseType = dataBase.getDatabaseType();
  5. if (databaseType == 1){
  6. url = "jdbc:mysql://" + dataBase.getUrl() + "?characterEncoding=UTF-8";
  7. }else if (databaseType == 2){
  8. url = "jdbc:oracle:thin:@" + dataBase.getUrl();
  9. }
  10. String username = dataBase.getUsername();
  11. String password = dataBase.getPassword();
  12. // 储存结果集
  13. List<Map<String, Object>> list = new ArrayList<>();
  14. Connection con = null;
  15. PreparedStatement st = null;
  16. ResultSet rs = null;
  17. try {
  18. // 加载驱动
  19. if (databaseType == 1){
  20. Class.forName("com.mysql.jdbc.Driver");
  21. }else if (databaseType == 2){
  22. Class.forName("oracle.jdbc.driver.OracleDriver");
  23. }
  24. // 获取数据库连接
  25. con = DriverManager.getConnection(url,username,password);
  26. st = con.prepareStatement(sql);
  27. // 通过正则进行增删改查的判断
  28. String selectReg = "^select|SELECT";
  29. Pattern selectP = Pattern.compile(selectReg);
  30. Matcher selectM = selectP.matcher(sql);
  31. JSONArray jsonArray = new JSONArray();
  32. // 查询
  33. if (selectM.find()){
  34. rs = st.executeQuery();
  35. // 获取查询结果元数据,如果rs为空则抛错,如果不为空则转为map赋值后转为String返回给前端
  36. ResultSetMetaData md = rs.getMetaData();
  37. int columnCount = md.getColumnCount();
  38. while (rs.next()){
  39. Map<String,Object> rowData = new HashMap<>(16);
  40. JSONObject jsonObject = new JSONObject();
  41. for (int i = 1; i <= columnCount; i++) {
  42. rowData.put(md.getColumnName(i), rs.getObject(i));
  43. jsonObject.put(md.getColumnName(i), rs.getObject(i));
  44. }
  45. list.add(rowData);
  46. jsonArray.add(jsonObject);
  47. }
  48. if (list.size()==0){
  49. return "请检查sql语句";
  50. }
  51. return JSON.toJSONString(list);
  52. }
  53. // 改\查\删
  54. else {
  55. Integer i = st.executeUpdate();
  56. if(i > 0){
  57. return "执行成功";
  58. }else {
  59. return "执行失败,请检查sql语句";
  60. }
  61. }
  62. } catch (ClassNotFoundException e) {
  63. e.printStackTrace();
  64. return "数据库驱动加载失败";
  65. } catch (SQLException e) {
  66. e.printStackTrace();
  67. return e.toString();
  68. } finally {
  69. if (rs != null) {
  70. try {
  71. rs.close();
  72. } catch (SQLException e) {
  73. e.printStackTrace();
  74. log.error("释放结果集失败");
  75. }
  76. }
  77. if (st != null) {
  78. try {
  79. st.close();
  80. } catch (SQLException e) {
  81. e.printStackTrace();
  82. }
  83. }
  84. if (con != null) {
  85. try {
  86. log.debug("数据库链接关闭成功!");
  87. con.close();
  88. } catch (SQLException e) {
  89. e.printStackTrace();
  90. log.error("关闭链接失败");
  91. }
  92. }
  93. }
  94. }

有疑问的小伙伴欢迎在文章下方留言,我会根据问题不断优化文章内容!

发表评论

表情:
评论列表 (有 0 条评论,62人围观)

还没有评论,来说两句吧...

相关阅读