From 3f17230b159ae6cdfa93691f1b0418ab4cff258a Mon Sep 17 00:00:00 2001 From: "YOHO\\20373" <2037305722@qq.com> Date: Fri, 27 Jun 2025 11:39:45 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90=E4=BF=AE=E6=94=B9=E3=80=91mysql?= =?UTF-8?q?=E7=BB=86=E8=8A=82=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/mysql/IMysqlLocalServiceImpl.java | 155 ++++++++++++++---- 1 file changed, 123 insertions(+), 32 deletions(-) diff --git a/src/main/java/com/example/exam/exam/service/mysql/IMysqlLocalServiceImpl.java b/src/main/java/com/example/exam/exam/service/mysql/IMysqlLocalServiceImpl.java index a27db89..b292fe6 100644 --- a/src/main/java/com/example/exam/exam/service/mysql/IMysqlLocalServiceImpl.java +++ b/src/main/java/com/example/exam/exam/service/mysql/IMysqlLocalServiceImpl.java @@ -128,6 +128,8 @@ public class IMysqlLocalServiceImpl implements IMysqlLocalService { } catch (SQLException e) { e.printStackTrace(); + appendToFile(answerLogPath, "未找到答题表:" +stuDataName+ ","+e.getMessage()); + judgementStr = HtmlAppender.appendHtmlLine(judgementStr, "未找到答题表:" +stuDataName+","+ e.getMessage()); } // // **建立连接到新创建的数据库** @@ -267,8 +269,7 @@ public class IMysqlLocalServiceImpl implements IMysqlLocalService { String answerId= examQuestionAnswer.getAnswerId(); List examMysqlKeywordList = examMysqlKeywordMapper.selectListByAnswerId(answerId); - - //把select语句 转化成验证语句sql + // 传入 INSERT SQL 和主键字段 String yanzheng = convertInsertToSelect(sql); String stuSql=null; @@ -894,6 +895,71 @@ public class IMysqlLocalServiceImpl implements IMysqlLocalService { judgementStr = studentScorePojo.getText(); } } + + + + if (sql.trim().toUpperCase().startsWith("ALTER TABLE")) { + appendToFile(answerLogPath, "=================修改表语句=================="); + judgementStr = HtmlAppender.appendHtmlLine(judgementStr, "==================修改表语句=================="); + appendToFile(answerLogPath, "答案语句: " + sql); + judgementStr = HtmlAppender.appendHtmlLine(judgementStr, "答案语句: "); + judgementStr = HtmlAppender.appendHtmlLine(judgementStr, sql); + // 匹配成功 + String answerId = examQuestionAnswer.getAnswerId(); + List examMysqlKeywordList= examMysqlKeywordMapper.selectListByAnswerId(answerId); + //转换成select语句 + String selectSql = convertAlertToSelectWhere(sql); + + List> answerList= new ArrayList<>(); + List> answerListStu = new ArrayList<>(); + try (Connection connanswer = DriverManager.getConnection(newDbUrl, user, password); + Statement stmtan = connanswer.createStatement()) { + try (ResultSet answer = stmtan.executeQuery(selectSql)) { + answerList = getAnswerList(answer); + appendToFile(answerLogPath, "查找语句标准答案"); + judgementStr = HtmlAppender.appendHtmlLine(judgementStr, "查找语句标准答案"); + printResult(answerList,judgementStr); + }catch (SQLException e) { + appendToFile(answerLogPath, "答案表执行验证语句"+selectSql+"时发生错误: " + e.getMessage()); + judgementStr = HtmlAppender.appendHtmlLine(judgementStr, "答案表执行验证语句"+selectSql+"时发生错误: " + e.getMessage()); + e.printStackTrace(); + } + } + String stuSql =null; + try (Connection connstu = DriverManager.getConnection(stuDbUrl, user, password); + Statement stmtstu = connstu.createStatement()) { + try (ResultSet answer = stmtstu.executeQuery(selectSql)) { + answerListStu = getAnswerList(answer); + appendToFile(answerLogPath, "运行学生语句的查询结果:"); + judgementStr = HtmlAppender.appendHtmlLine(judgementStr, "运行学生语句的查询结果:"); + judgementStr= printResult(answerListStu,judgementStr); + } catch (SQLException e) { + appendToFile(answerLogPath, "学生表执行验证语句"+selectSql+"时发生错误:" + e.getMessage()); + judgementStr = HtmlAppender.appendHtmlLine(judgementStr, "学生表执行验证语句"+selectSql+"时发生错误: " + e.getMessage()); + } + + + } + boolean isEquivalent =false; + + if (answerListStu!=null&&answerListStu.size()>0){ + isEquivalent = compareResultsSelect(answerList, answerListStu); + } + // + if (isEquivalent) { + SourceAndText studentScorePojo = accumulateScoreAndLog(examMysqlKeywordList,total,answerLogPath,sql,totalKeyScore,score,answerId,scoreTotal,judgementStr); + scoreTotal += studentScorePojo.getScore(); + judgementStr = studentScorePojo.getText(); + + } else { + SourceAndText studentScorePojo= calculateTotalScoreRate(sql, examMysqlKeywordList,totalKeyScore,score,answerId,scoreTotal,judgementStr); + scoreTotal += studentScorePojo.getScore(); + judgementStr = studentScorePojo.getText(); + + } + + } + } //删除临时创建的数据库databaseName @@ -917,6 +983,23 @@ public class IMysqlLocalServiceImpl implements IMysqlLocalService { sourceAndText.setText(judgementStr); return sourceAndText; } + public static String convertAlertToSelectWhere(String sql) { + if (sql == null || sql.trim().isEmpty()) return null; + + // 正则提取表名和字段名(支持反引号) + Pattern pattern = Pattern.compile( + "ALTER\\s+TABLE\\s+`?(\\w+)`?\\s+MODIFY\\s+COLUMN\\s+`?(\\w+)`?", + Pattern.CASE_INSENSITIVE); + Matcher matcher = pattern.matcher(sql); + + if (matcher.find()) { + String tableName = matcher.group(1); + String columnName = matcher.group(2); + return "SHOW COLUMNS FROM " + tableName + " LIKE '" + columnName + "';"; + } + + return null; + } @Override public void delMysqlConnect(List tNames) { @@ -1526,49 +1609,57 @@ public class IMysqlLocalServiceImpl implements IMysqlLocalService { return callStatements; } - public static String convertInsertToSelect(String insertSql) { - // 匹配表名和插入值 - Pattern pattern = Pattern.compile("INSERT INTO\\s+`?(\\w+)`?\\s*\\(.*?\\)\\s*VALUES\\s*(.+);?", Pattern.CASE_INSENSITIVE | Pattern.DOTALL); - Matcher matcher = pattern.matcher(insertSql); - if (!matcher.find()) { - throw new IllegalArgumentException("无法解析 INSERT 语句"); - } + public static String convertInsertToSelect(String insertSql) { + Pattern pattern = Pattern.compile( + "INSERT INTO\\s+`?(\\w+)`?\\s*\\((.*?)\\)\\s*VALUES\\s*\\((.*?)\\)", + Pattern.CASE_INSENSITIVE | Pattern.DOTALL + ); + Matcher matcher = pattern.matcher(insertSql); + if (!matcher.find()) throw new IllegalArgumentException("无法解析 INSERT 语句"); String tableName = matcher.group(1); - String valuesPart = matcher.group(2); + String columnStr = matcher.group(2); + String valueStr = matcher.group(3); - // 匹配所有 ('xxx', ...) 或者 ('xxx') - Pattern valPattern = Pattern.compile("\\((.*?)\\)"); - Matcher valMatcher = valPattern.matcher(valuesPart); + String[] columns = columnStr.split("\\s*,\\s*"); + String[] values = valueStr.split("\\s*,\\s*"); - Set values = new LinkedHashSet<>(); - while (valMatcher.find()) { - String valueStr = valMatcher.group(1).trim(); - // 如果是单字段插入,可能只有一个值 - if (!valueStr.contains(",")) { - values.add(valueStr.replaceAll("^'|'$", "").replace("'", "''")); + if (columns.length != values.length) { + throw new IllegalArgumentException("字段和值数量不匹配"); + } + + // 构造 column-value 映射 + Map columnValueMap = new LinkedHashMap<>(); + for (int i = 0; i < columns.length; i++) { + String col = columns[i].trim(); + String val = values[i].trim(); + + // 处理引号 + if ((val.startsWith("'") && val.endsWith("'")) || (val.startsWith("\"") && val.endsWith("\""))) { + val = val.substring(1, val.length() - 1).replace("''", "'"); } + + columnValueMap.put(col, val); } - if (values.isEmpty()) { - throw new IllegalArgumentException("未提取到插入值"); + // 构造 SELECT 语句 + StringBuilder sb = new StringBuilder("SELECT * FROM "); + sb.append(tableName).append(" WHERE "); + + List conditions = new ArrayList<>(); + for (Map.Entry entry : columnValueMap.entrySet()) { + conditions.add(entry.getKey() + " = '" + entry.getValue().replace("'", "''") + "'"); } - // 拼接验证 SQL - StringBuilder selectBuilder = new StringBuilder("SELECT * FROM "); - selectBuilder.append(tableName).append(" WHERE teamName IN ("); - int i = 0; - for (String val : values) { - if (i++ > 0) selectBuilder.append(", "); - selectBuilder.append("'").append(val).append("'"); - } - selectBuilder.append(")"); - - return selectBuilder.toString(); + sb.append(String.join(" AND ", conditions)); + return sb.toString(); } + + + /** * 比较两个查询的结果 */