如何用Java从SQL中提取出涉及到的表名、列名?

=Start=

缘由:

记录整理一下如何用Java从SQL中提取出涉及到的表名和列名。

正文:

参考解答:

最早我是想用Python实现这个功能的,因为在字符串处理方面Python相比于Java来说要方便太多,但是在网上找了一圈资料后发现,如果想单纯用Python自己手写实现,难度有点大,而且很难保证提取的效果。而Java在资源生态这方面的优势就比较大了,比如:

ANTLR4、Apache Calcite、Alibaba Druid

上面的这几个工具各有优缺点,在此不细说,后续会整理一些这方面的资料方便需要的人进行参考。这里主要把使用Alibaba Druid提取SQL表名、列名的方法实践整理并记录一下,方便自己查阅和参考。

Alibaba Druid其实是阿里开源的一个(有统计、监控功能的)数据库连接池实现,作为数据库连接池,它自身也有一个SQL解析模块,这里就是借助它提供的SQL解析模块实现我们需要的一些功能。

代码样例:

参考链接:

关于SQL解析,为何编程语言解析器ANTLR更胜一筹?
https://mp.weixin.qq.com/s/Di11ZzqiiY0tJYDRhfdCPw

Parsing mysql using ANTLR4 simple example
https://stackoverflow.com/questions/49769147/parsing-mysql-using-antlr4-simple-example

Dynamic Data Masking 动态数据脱敏
https://hhyo.github.io/2018/04/16/data-masking/

几种基于Java的SQL解析工具的比较与调用
https://www.cnblogs.com/blueglass/p/6286814.html
http://www.zhongruitech.com/168055984.html

=END=

声明: 除非注明,ixyzero.com文章均为原创,转载请以链接形式标明本文地址,谢谢!
https://ixyzero.com/blog/archives/4405.html

《如何用Java从SQL中提取出涉及到的表名、列名?》上有3条评论

  1. Alibaba Druid SQL Parser
    https://github.com/alibaba/druid/wiki/SQL-Parser

    和Antlr生成的SQL有很大不同的是,Druid SQL Parser性能非常好,可以用于生产环境直接对SQL进行分析处理。
    Druid的SQL Parser是手工编写,性能非常好,目标就是在生产环境运行时使用的SQL Parser,性能比antlr、javacc之类工具生成的Parser快10倍甚至100倍以上。

    Druid的sql parser是目前支持各种数据语法最完备的SQL Parser。

    Alibaba Druid SQL_Parser_Demo_visitor
    https://github.com/alibaba/druid/wiki/SQL_Parser_Demo_visitor

  2. 用 Go 构建一个 SQL 解析器
    https://mp.weixin.qq.com/s/F9z5oPk-mSauliOHk3FJEA
    http://github.com/marianogappa/sqlparser

    本文旨在简单介绍如何在 Go 中构造 LL(1) 解析器,在本例中用于解析SQL查询。

    为了简单起见,我们将处理子选择、函数、复杂嵌套表达式和所有 SQL 风格都支持的其他特性。这些特性与我们将要使用的策略紧密相关。

    一个解析器包含两个部分:
    词法分析:也就是“Tokeniser”
    语法分析:AST 的创建

    这个实验非常适合:
    · 学习 LL(1) 解析器算法
    · 自定义解析无依赖关系的简单语法

    然而,这种方法可能会变得单调乏味,而且有一定的局限性。考虑一下如何解析任意复杂的复合表达式(例如 sqrt(a) =(1 *(2 + 3)))。
    要获得更强大的解析模型,请查看解析器组合符。goyacc 是一个流行的Go实现。

发表评论

电子邮件地址不会被公开。 必填项已用*标注