SpringBoot + Druid SQL Parser 解析表名、字段名(纯Java,最佳方案)

Druid 自带的 SQL 解析器(com.alibaba.druid.sql.parser),这是Java 生态最稳定、生产环境最常用的 SQL 解析方案,完全不用 Python、不用 sqlparse!

直接复制可用的 SpringBoot 完整代码,支持:

  • 解析 SELECT / INSERT / UPDATE / DELETE
  • 解析 多表、JOIN、子查询、别名
  • 提取 所有表名 + 所有字段名
  • 兼容 MySQL、Oracle、PostgreSQL 等

  1. 引入 Druid 依赖(Maven)

com.alibaba druid 1.2.20


  1. 纯 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;

      }

      }


  1. 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");
}

}


  1. 测试效果(超强)
    输入 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

  1. 支持所有 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

  1. 为什么推荐 Druid SQLParser?(比 sqlparse 强太多)
  2. 纯 Java,无任何第三方依赖、无 Python 环境要求
  3. 生产级稳定,阿里内部大量使用
  4. 支持复杂 SQL:join、子查询、union、with 子句、嵌套查询
  5. 自动去重,自动识别别名
  6. 速度极快,适合高性能场景

总结

  1. Druid SQLParser 是 SpringBoot 解析 SQL 最优方案
  2. 代码直接复制可用,无需改任何配置
  3. 自动提取 所有表名 + 所有字段
  4. 支持全场景 SQL:select/insert/update/delete/join/ 子查询
相关推荐
覆东流10 小时前
7.Java数组
java·开发语言·后端
m0_7190841110 小时前
限流和获取请求ip的方法
java
lzhdim11 小时前
提高 SQL 语句执行速度的方法
java·开发语言·数据库·sql·oracle
深漂的华哥11 小时前
Ruoyi-Plus前后端分离场景下,数据加密传输
java·spring boot·后端·开源·maven·ruoyi
落魄大学生之流水线上谋生计13 小时前
Java锁全面指南:从基础概念到企业级应用
java·开发语言
剑胆琴心静水深流13 小时前
全栈之路6---web集成与呈现
前端·vue.js·spring boot·分布式·spring·前端框架·npm
Faith_xzc14 小时前
一条 SQL 顶一条 Flink 链路?Doris Streaming Job 持续导入全景解析
大数据·数据库·sql·flink
爱学习的小白柏14 小时前
【AI问数技术】多Agent协同架构:查询规划/SQL生成/洞察分析/报告生成
java·网络·人工智能·windows·sql·架构·llama
码匠许师傅14 小时前
【C++ 面试真题】30. 聊聊 C++ 的互斥锁与读写锁
java·c++·面试
沙盘客14 小时前
AFSIM 示例解读(03)· 六自由度飞行仿真 six_dof(下):机场运作与弹道导弹投送
java·javascript·经验分享