Druid 自带的 SQL 解析器(com.alibaba.druid.sql.parser),这是Java 生态最稳定、生产环境最常用的 SQL 解析方案,完全不用 Python、不用 sqlparse!
直接复制可用的 SpringBoot 完整代码,支持:
- 解析 SELECT / INSERT / UPDATE / DELETE
- 解析 多表、JOIN、子查询、别名
- 提取 所有表名 + 所有字段名
- 兼容 MySQL、Oracle、PostgreSQL 等
- 引入 Druid 依赖(Maven)
com.alibaba druid 1.2.20
- 纯 Java 工具类(直接复制)
自动提取:所有表名 + 所有字段
import com.alibaba.druid.sql.SQLUtils;
import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlSchemaStatVisitor;
import com.alibaba.druid.stat.TableStat;
import com.alibaba.druid.util.JdbcConstants;
import java.util.*;
/**
-
Druid SQL 解析工具(提取 表名、字段名)
*/
public class DruidSqlParser {
// 数据库类型:mysql / oracle / postgresql
private static final String DB_TYPE = JdbcConstants.MYSQL;
/**
-
解析 SQL,返回 表名 + 字段名
*/
public static Map<String, Set> parseSql(String sql) {
Map<String, Set> result = new HashMap<>();
Set tables = new HashSet<>();
Set columns = new HashSet<>();
try {
// 1. 解析 SQL
List stmtList = SQLUtils.parseStatements(sql, DB_TYPE);
for (SQLStatement stmt : stmtList) { // 2. 使用访问器提取 表、字段 MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); stmt.accept(visitor); // 3. 提取所有表名 for (TableStat.Name tableName : visitor.getTables().keySet()) { tables.add(tableName.getName()); } // 4. 提取所有字段名(去重) for (TableStat.Column column : visitor.getColumns()) { columns.add(column.getName()); } }} catch (Exception e) {
e.printStackTrace();
}
result.put("tables", tables);
result.put("columns", columns);
return result;
}
}
-
- SpringBoot 测试接口
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.Map;
import java.util.Set;
@RestController
public class SqlParseController {
@GetMapping("/parse/druid")
public String parseWithDruid(@RequestParam String sql) {
Map<String, Set<String>> result = DruidSqlParser.parseSql(sql);
return "Druid 解析结果:\n" +
"表名:" + result.get("tables") + "\n" +
"字段:" + result.get("columns");
}
}
- 测试效果(超强)
输入 SQL
select u.id, u.name, r.role_name
from user u
join role r on u.role_id = r.id
where u.age > 18
输出结果
Druid 解析结果:
表名:[user, role]
字段:[id, name, role_name, role_id, age]
- 支持所有 SQL 类型
✅ INSERT
insert into user(name, age) values('张三', 20)
表:[user]
字段:[name, age]
✅ UPDATE
update user set name='李四' where id=1
表:[user]
字段:[name, id]
✅ DELETE
delete from user where age < 18
表:[user]
字段:[age]
- 为什么推荐 Druid SQLParser?(比 sqlparse 强太多)
- 纯 Java,无任何第三方依赖、无 Python 环境要求
- 生产级稳定,阿里内部大量使用
- 支持复杂 SQL:join、子查询、union、with 子句、嵌套查询
- 自动去重,自动识别别名
- 速度极快,适合高性能场景
总结
- Druid SQLParser 是 SpringBoot 解析 SQL 最优方案
- 代码直接复制可用,无需改任何配置
- 自动提取 所有表名 + 所有字段
- 支持全场景 SQL:select/insert/update/delete/join/ 子查询