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/ 子查询
相关推荐
学计算机的计算基17 小时前
LeetCode 图论四题精讲:BFS、拓扑排序、Trie 树的模板与优化
java·笔记·算法
浩瀚地学17 小时前
【面试算法笔记】0202-链表-基本功能实现
java·经验分享·笔记·算法·面试
3DVisionary17 小时前
如何用单目高速DIC把“看不见“的振动变成“数得清“的数据
java·spring boot·python·数码相机·微小振动·精密件·单目高速dic
tkevinjd17 小时前
416分割等和子集
java·python·算法·leetcode·职场和发展
hdsoft_huge17 小时前
SpringBoot系列12:整合RabbitMQ消息队列,异步解耦、死信队列完整业务案例
spring boot·rabbitmq·java-rabbitmq
qq_4523962317 小时前
第三篇:《Jenkins Pipeline as Code:Declarative Pipeline 深度实战》
java·servlet·jenkins
再让我睡两分钟17 小时前
【无标题】
android·java·数据库·人工智能·prompt·ai应用开发
折哥的程序人生 · 物流技术专研18 小时前
Java 23 种设计模式:从踩坑到精通 | 番外:工厂方法 vs 抽象工厂 —— 从单产品到产品族,架构如何演进?
java·spring·java面试·抽象工厂·工厂方法·java设计模式·从踩坑到精通
爸爸61918 小时前
30 原始 SQL 查询与聚合统计:querySql 实战
数据库·sql·华为·harmonyos·鸿蒙系统
砍材农夫18 小时前
spring|spring event|Spring内置事件驱动编程模型
java·数据库·spring