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/ 子查询
相关推荐
leikooo2 小时前
用餐厅和盘子理解栈和堆
java·数据结构·链表·rust
Ivanqhz3 小时前
激活函数在 Transformer 中的作用及各种变体简述
java·linux·数据库·人工智能·深度学习
沙漠之主4 小时前
C++编程教学设计资料:从入门到实战的完整课程方案
java·前端·c++
Seraphina364 小时前
SQLI-labs(一)黑盒全流程
sql·安全·web安全
FPGA小徐4 小时前
PA1 基础设施(2)深度解析:NEMU 中 ITRACE、MTRACE、FTRACE、IRINGBUF、ETRACE、DIFFTEST 全解析
java·服务器·网络
YOLO数据集集合5 小时前
EvoAgent:面向PR研发治理的自进化Multi-Agent Harness系统
java·开发语言·目标检测·agent·自进化
知行EDI5 小时前
知行之桥 MaBang 端口使用指南——Create Order 订单创建篇
java·服务器·数据库
笑鸿的学习笔记5 小时前
C++笔记之大块顺序写
java·c++·笔记
打工仔折腾 AI5 小时前
从 Demo 到生产级 Agent:8 个关键设计机制与 Python 实现拆解
java·jvm·人工智能·后端·python·langchain·ai agent 实战
殷色玫瑰6 小时前
C/C++ 内存管理详解:从内存分布到 new/delete 底层原理
java·linux·c语言·c++