从一句SQL中获取表的名称

1,377 阅读1分钟

需求

给一个SQL,需要解析出涉及到的数据表的名称

解决方法

方法一:druid

如何使用

最强的方法,基于druid的SQL解析功能获取表的名称

开始的时候感觉很垃圾,以为只能识别很简单的SQL语句里面的表。后来发现是自己用错了,完整代码如下:

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.0.19</version>
</dependency>
public String getTableName(String sql) {
    String dbType = JdbcConstants.MYSQL;
    // 格式化输出
    String format = SQLUtils.format(sql, dbType);
    System.out.println(format);

    List<SQLStatement> sqlStatements = SQLUtils.parseStatements(sql, dbType);

    // 独立语句的个数
    int size = sqlStatements.size();
    System.out.println(size);

    StringBuilder stringBuilder = new StringBuilder();

    for (SQLStatement stmt : sqlStatements) {
        MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor();
        stmt.accept(visitor);
        stringBuilder.append(visitor.getTables.keyset()).append(" ");
    }
    return stringBuilder.toString();
}

Druid Visitor原理分析

原理我还没有深刻理解,先放在这里

参考:
zhuanlan.zhihu.com/p/411029742
blog.51cto.com/u_15064626/… (详细)

方法二

使用Jsqlparser从复杂SQL语句中提取表名_java_码云网 (findsrc.com)

方法三:

(98条消息) 正则表达式获取sql语句中的表名_数据产品小lee的博客-CSDN博客_从sql语句中获取表名