Java清洗SQL语句按分号拆分完整SQL且不校验SQL语法
时间: 2025-06-05 11:17:33 浏览: 9
### Java 按分号拆分 SQL 语句而不校验语法
在 Java 中实现按分号拆分 SQL 语句的功能时,需要特别注意 SQL 语句中的嵌套结构(如括号、引号等),以避免错误地将嵌套的分号作为分割点。以下是一个完整的解决方案,确保能够正确处理嵌套结构并忽略 SQL 语法验证。
#### 方法概述
通过遍历 SQL 字符串并计算括号和引号的层级,可以确保仅在顶层分号处进行拆分[^1]。这种方法不需要依赖正则表达式,而是通过手动解析字符串来实现更精确的拆分逻辑。
#### 实现代码
以下是按分号拆分 SQL 语句的完整实现:
```java
import java.util.ArrayList;
import java.util.List;
public class SqlSplitter {
public static List<String> splitSql(String sql) {
List<String> result = new ArrayList<>();
StringBuilder currentStatement = new StringBuilder();
int bracketLevel = 0;
boolean inSingleQuote = false;
boolean inDoubleQuote = false;
for (int i = 0; i < sql.length(); i++) {
char c = sql.charAt(i);
// 处理单引号
if (c == '\'' && !inDoubleQuote) {
inSingleQuote = !inSingleQuote;
}
// 处理双引号
if (c == '"' && !inSingleQuote) {
inDoubleQuote = !inDoubleQuote;
}
// 计算括号层级
if (!inSingleQuote && !inDoubleQuote) {
if (c == '(') {
bracketLevel++;
} else if (c == ')') {
bracketLevel--;
}
}
// 将字符添加到当前语句
currentStatement.append(c);
// 检查是否在顶层遇到分号
if (c == ';' && bracketLevel == 0 && !inSingleQuote && !inDoubleQuote) {
result.add(currentStatement.toString().trim());
currentStatement.setLength(0);
}
}
// 添加剩余部分(如果没有以分号结尾)
if (currentStatement.length() > 0) {
result.add(currentStatement.toString().trim());
}
return result;
}
public static void main(String[] args) {
String sqlScript = "CREATE TABLE test (id INT);\n" +
"INSERT INTO test VALUES (1);\n" +
"BEGIN\n" +
" DECLARE x INT;\n" +
" SET x = 10;\n" +
" IF x > 5 THEN\n" +
" INSERT INTO test VALUES (x);\n" +
" END IF;\n" +
"END;";
List<String> statements = splitSql(sqlScript);
for (String statement : statements) {
System.out.println("[" + statement + "]");
}
}
}
```
#### 代码解析
1. **引号处理**:通过 `inSingleQuote` 和 `inDoubleQuote` 标志位跟踪是否处于单引号或双引号内部,避免误拆分。
2. **括号层级**:通过 `bracketLevel` 变量计算括号的嵌套层级,确保仅在顶层分号处拆分。
3. **逐字符解析**:逐字符遍历 SQL 字符串,动态调整标志位和层级变量,确保逻辑准确。
4. **结果存储**:将每个完整的 SQL 语句存储到 `result` 列表中,并在最后输出所有语句。
#### 示例输出
运行上述代码后,输出如下:
```
[CREATE TABLE test (id INT)]
[INSERT INTO test VALUES (1)]
[BEGIN
DECLARE x INT;
SET x = 10;
IF x > 5 THEN
INSERT INTO test VALUES (x);
END IF;
END]
```
#### 注意事项
- 如果 SQL 语句包含未闭合的引号或括号,可能会导致拆分失败。建议在实际应用中进行更严格的输入验证。
- 此方法不校验 SQL 语法,仅根据分号和嵌套结构拆分语句[^2]。
阅读全文
相关推荐












