【修改】mysql细节修改
This commit is contained in:
@@ -128,6 +128,8 @@ public class IMysqlLocalServiceImpl implements IMysqlLocalService {
|
|||||||
|
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
e.printStackTrace();
|
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();
|
String answerId= examQuestionAnswer.getAnswerId();
|
||||||
List<ExamMysqlKeyword> examMysqlKeywordList = examMysqlKeywordMapper.selectListByAnswerId(answerId);
|
List<ExamMysqlKeyword> examMysqlKeywordList = examMysqlKeywordMapper.selectListByAnswerId(answerId);
|
||||||
|
|
||||||
|
// 传入 INSERT SQL 和主键字段
|
||||||
//把select语句 转化成验证语句sql
|
|
||||||
String yanzheng = convertInsertToSelect(sql);
|
String yanzheng = convertInsertToSelect(sql);
|
||||||
|
|
||||||
String stuSql=null;
|
String stuSql=null;
|
||||||
@@ -894,6 +895,71 @@ public class IMysqlLocalServiceImpl implements IMysqlLocalService {
|
|||||||
judgementStr = studentScorePojo.getText();
|
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<ExamMysqlKeyword> examMysqlKeywordList= examMysqlKeywordMapper.selectListByAnswerId(answerId);
|
||||||
|
//转换成select语句
|
||||||
|
String selectSql = convertAlertToSelectWhere(sql);
|
||||||
|
|
||||||
|
List<List<String>> answerList= new ArrayList<>();
|
||||||
|
List<List<String>> 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
|
//删除临时创建的数据库databaseName
|
||||||
@@ -917,6 +983,23 @@ public class IMysqlLocalServiceImpl implements IMysqlLocalService {
|
|||||||
sourceAndText.setText(judgementStr);
|
sourceAndText.setText(judgementStr);
|
||||||
return sourceAndText;
|
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
|
@Override
|
||||||
public void delMysqlConnect(List<String> tNames) {
|
public void delMysqlConnect(List<String> tNames) {
|
||||||
@@ -1526,48 +1609,56 @@ public class IMysqlLocalServiceImpl implements IMysqlLocalService {
|
|||||||
|
|
||||||
return callStatements;
|
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()) {
|
public static String convertInsertToSelect(String insertSql) {
|
||||||
throw new IllegalArgumentException("无法解析 INSERT 语句");
|
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 tableName = matcher.group(1);
|
||||||
String valuesPart = matcher.group(2);
|
String columnStr = matcher.group(2);
|
||||||
|
String valueStr = matcher.group(3);
|
||||||
|
|
||||||
// 匹配所有 ('xxx', ...) 或者 ('xxx')
|
String[] columns = columnStr.split("\\s*,\\s*");
|
||||||
Pattern valPattern = Pattern.compile("\\((.*?)\\)");
|
String[] values = valueStr.split("\\s*,\\s*");
|
||||||
Matcher valMatcher = valPattern.matcher(valuesPart);
|
|
||||||
|
|
||||||
Set<String> values = new LinkedHashSet<>();
|
if (columns.length != values.length) {
|
||||||
while (valMatcher.find()) {
|
throw new IllegalArgumentException("字段和值数量不匹配");
|
||||||
String valueStr = valMatcher.group(1).trim();
|
|
||||||
// 如果是单字段插入,可能只有一个值
|
|
||||||
if (!valueStr.contains(",")) {
|
|
||||||
values.add(valueStr.replaceAll("^'|'$", "").replace("'", "''"));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (values.isEmpty()) {
|
// 构造 column-value 映射
|
||||||
throw new IllegalArgumentException("未提取到插入值");
|
Map<String, String> 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("''", "'");
|
||||||
}
|
}
|
||||||
|
|
||||||
// 拼接验证 SQL
|
columnValueMap.put(col, val);
|
||||||
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();
|
// 构造 SELECT 语句
|
||||||
|
StringBuilder sb = new StringBuilder("SELECT * FROM ");
|
||||||
|
sb.append(tableName).append(" WHERE ");
|
||||||
|
|
||||||
|
List<String> conditions = new ArrayList<>();
|
||||||
|
for (Map.Entry<String, String> entry : columnValueMap.entrySet()) {
|
||||||
|
conditions.add(entry.getKey() + " = '" + entry.getValue().replace("'", "''") + "'");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sb.append(String.join(" AND ", conditions));
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 比较两个查询的结果
|
* 比较两个查询的结果
|
||||||
|
Reference in New Issue
Block a user