使用Druid解析SQL,获取SQL中所有使用的表

这篇具有很好参考价值的文章主要介绍了使用Druid解析SQL,获取SQL中所有使用的表。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 文章来源地址https://www.toymoban.com/news/detail-660320.html

一、sqlParse组成

Druid SQL Parser分三个模块:

- Parser

- AST

- Visitor

1.1 Parser

parser是将输入文本转换为ast(抽象语法树),parser有包括两个部分,Parser和Lexer,其中Lexer实现词法分析,Parser实现语法分析。

1.2 AST

AST是Abstract Syntax Tree的缩写,也就是抽象语法树。AST是parser输出的结果。这也是语法树的精髓了,sql解析,本质上就是把sql转为 ast语法树,拿到这个语法树后,我们就能做很多事了,遍历也好,加点,修改也好,都可以在ast上完成。

 

使用Druid解析SQL,获取SQL中所有使用的表,sql,java,算法

二、java代码编写

 

 

 

  /**
     * 根据sql由获取sql的表名
     * @param sql
     * @param dbType  数据库类型  可以用JdbcConstants.MYSQL
     * @return Map<别名, 表名>
     */
    public static Map<String /* 别名 */, String /* 表名 */> getTables(String sql,DBType dbType) {
        List<SQLStatement> stmtList = SQLUtils.parseStatements(sql, dbType.name())
        Map<String, String> tables = new HashMap<String, String>();

        for (SQLStatement stmt : stmtList) {
            SchemaStatVisitor visitor = SQLUtils.createSchemaStatVisitor(dbType);
            stmt.accept(visitor);
            for (SQLName originalTable : visitor.getOriginalTables()) {
                if (originalTable instanceof SQLIdentifierExpr) {
                    String tableName = ((SQLIdentifierExpr) originalTable).getName();
                    SQLObject parent = originalTable.getParent();
                    String alias = null;
                    if (parent instanceof SQLPropertyExpr) {
                        alias = ((SQLPropertyExpr) parent).getResolvedTableSource().getAlias();
                    } else if (parent instanceof SQLExprTableSource) {
                        alias = ((SQLExprTableSource) parent).getAlias();
                    }
                    if (null == alias) {
                        alias = tableName;
                    }
                    tables.put(alias, tableName);
                }
            }
        }
        return tables;
    }

三、调试结果 

使用Druid解析SQL,获取SQL中所有使用的表,sql,java,算法 

对于MLSQL JDBC的表列信息解析依赖于Druid,因此语法支持受限于Druid,目前Druid的支持如下:

数据库 DML DDL
odps 完全支持 完全支持
mysql 完全支持 完全支持
postgresql 完全支持 完全支持
oracle 支持大部分 支持大部分
sql server 支持常用的 支持常用的
db2 支持常用的 支持常用的
hive 支持常用的 支持常用的

四、源码支持DB类型 

目前我用的Druid是1.2.18目前源码支持的dbType类型如下

使用Druid解析SQL,获取SQL中所有使用的表,sql,java,算法 

 

到了这里,关于使用Druid解析SQL,获取SQL中所有使用的表的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SQL FULL OUTER JOIN 关键字:左右表中所有记录的全连接解析

    SQL RIGHT JOIN返回右表(table2)中的所有记录以及左表(table1)中的匹配记录。如果没有匹配,则左侧的结果为0条记录。 注意:在某些数据库中,RIGHT JOIN被称为RIGHT OUTER JOIN。 在本教程中,我们将使用著名的Northwind示例数据库。 以下是“Orders”表的部分选择: OrderID C

    2024年02月05日
    浏览(55)
  • jsqlparser解析sql获取表名,字段等

    在项目中需要多sql进行统一拦截处理,但是传入的sql千奇百怪,并有一些逻辑判断,如只对哪张表处理之类,因此需要对sql进行解析后,进行相关逻辑处理。 这里使用 jsqlparser 工具进行sql解析。 maven组件引入 使用方式 输出结果:

    2024年02月16日
    浏览(55)
  • [druid or mybatis] merge sql error, dbType mysql, druid-1.2.12, sql : .

    报这个问题,处理的时候是真的难受了。最终定位到的是自己的mybatis的标签内存在多余的标点 \\\" . \\\" 当时都给尬笑了,还好解决了。

    2024年02月12日
    浏览(48)
  • spark sql 查看全部数据库的表

    大数据环境下,metastore一般都交个hive处理,随着数据库 表 越来越多,进行源数据管理的就会成为痛点,如何能够查询出所有的数据库下的所有表 Spark 官方文档Tables 官方给的sample中,只能一个库一个库查询,如果有成百上千个库呢? 从 Python 3.6 开始,Python f 字符串可用。

    2024年02月14日
    浏览(39)
  • Flink---14、Flink SQL(SQL-Client准备、流处理中的表、时间属性、DDL)

                           星光下的赶路人star的个人主页                        你生而真实,而非完美 Table API和SQL是最上层的API,在Flink中这两种API被集成在一起,SQL执行的对象也是Flink中的表(Table),所以我们一般会认

    2024年02月06日
    浏览(40)
  • 千万级数据的表,我把慢sql优化后性能提升30倍!

    背景:系统中有一个统计页面加载特别慢,前端设置的40s超时时间都加载不出来数据,因为是个统计页面,基本上一猜就知道是mysql的语句有问题,遗留了很久没有解决,正好趁不忙的时候,下定决心一定把它给搞定! (mysql5.7) 执行一下问题sql,可以看到单表查就需要61s 这

    2024年02月14日
    浏览(50)
  • 查看SQL Server的表字段类型、长度、描述以及是否可为null

    本文参考:https://blog.csdn.net/josjiang1/article/details/80558068。 也可以直接点击这里文章链接: sql server查询表结构(字段名,数据类型,长度,描述,是否允许为空,是否为主键)。 小步测试 先查询表的ID 2. 查询表的信息 对于我来说足够了。 组合一下 将上面两句组合一下: 参

    2024年01月22日
    浏览(42)
  • Java解析SQL的基本思路

    天天在写sql,一直很好奇sql到底咋解析的,于是随便整个小demo。 比如sql是: 中间可能有1个或者多个空格,就想着怎么着也得有个分词的类,就叫做Tokenizer吧。 这是一个名为Tokenizer的Java类,实现了Iterator接口。它用于将输入的SQL语句进行分词。 构造函数Tokenizer(String sql)接受

    2024年02月12日
    浏览(33)
  • Druid连接池工具公式化SQL附踩坑记录

    使用Druid连接池工具格式化sql用于回显时候美观展示 之前我使用的是druid为1.2.4版本,在解析pg库sql时候,发现执行结果如下: 可以发现,转换函数::在解析时候异常了 切换高版本1.2.6及以上,可以正常解析。 druid的1.2.6以下版本对于包含数值使用::转换为varchar的场景不支持,会

    2024年01月19日
    浏览(42)
  • 使用navicat利用sql语句查询表所有字段的字段名,类型,长度。

    想要在navicat下,用sql语句查询一个表的所有字段和其相关信息。 打开所需要查询的表的数据库 查新建询 把下面的sql语句复制粘贴到新建的查询编辑器中并修改库名和表 这样表的相关信息就会显示出来了,将其选中,点击鼠标右键,——复制为——制表符分隔值(字段名和

    2023年04月08日
    浏览(99)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包