国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

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

這篇具有很好參考價(jià)值的文章主要介紹了使用Druid解析SQL,獲取SQL中所有使用的表。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

?文章來源地址http://www.zghlxwxcb.cn/news/detail-660320.html

一、sqlParse組成

Druid SQL Parser分三個(gè)模塊:

- Parser

- AST

- Visitor

1.1 Parser

parser是將輸入文本轉(zhuǎn)換為ast(抽象語法樹),parser有包括兩個(gè)部分,Parser和Lexer,其中Lexer實(shí)現(xiàn)詞法分析,Parser實(shí)現(xiàn)語法分析。

1.2 AST

AST是Abstract Syntax Tree的縮寫,也就是抽象語法樹。AST是parser輸出的結(jié)果。這也是語法樹的精髓了,sql解析,本質(zhì)上就是把sql轉(zhuǎn)為 ast語法樹,拿到這個(gè)語法樹后,我們就能做很多事了,遍歷也好,加點(diǎn),修改也好,都可以在ast上完成。

?

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

二、java代碼編寫

?

?

?

? /**
? ? ?* 根據(jù)sql由獲取sql的表名
? ? ?* @param sql
?? ? * @param dbType ?數(shù)據(jù)庫類型 ?可以用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;
? ? }

三、調(diào)試結(jié)果?

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

對(duì)于MLSQL JDBC的表列信息解析依賴于Druid,因此語法支持受限于Druid,目前Druid的支持如下:

數(shù)據(jù)庫 DML DDL
odps 完全支持 完全支持
mysql 完全支持 完全支持
postgresql 完全支持 完全支持
oracle 支持大部分 支持大部分
sql server 支持常用的 支持常用的
db2 支持常用的 支持常用的
hive 支持常用的 支持常用的

四、源碼支持DB類型?

目前我用的Druid是1.2.18目前源碼支持的dbType類型如下

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

?

到了這里,關(guān)于使用Druid解析SQL,獲取SQL中所有使用的表的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • SQL FULL OUTER JOIN 關(guān)鍵字:左右表中所有記錄的全連接解析

    SQL FULL OUTER JOIN 關(guān)鍵字:左右表中所有記錄的全連接解析

    SQL RIGHT JOIN返回右表(table2)中的所有記錄以及左表(table1)中的匹配記錄。如果沒有匹配,則左側(cè)的結(jié)果為0條記錄。 注意:在某些數(shù)據(jù)庫中,RIGHT JOIN被稱為RIGHT OUTER JOIN。 在本教程中,我們將使用著名的Northwind示例數(shù)據(jù)庫。 以下是“Orders”表的部分選擇: OrderID C

    2024年02月05日
    瀏覽(18)
  • jsqlparser解析sql獲取表名,字段等

    在項(xiàng)目中需要多sql進(jìn)行統(tǒng)一攔截處理,但是傳入的sql千奇百怪,并有一些邏輯判斷,如只對(duì)哪張表處理之類,因此需要對(duì)sql進(jìn)行解析后,進(jìn)行相關(guān)邏輯處理。 這里使用 jsqlparser 工具進(jìn)行sql解析。 maven組件引入 使用方式 輸出結(jié)果:

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

    [druid or mybatis] merge sql error, dbType mysql, druid-1.2.12, sql : .

    報(bào)這個(gè)問題,處理的時(shí)候是真的難受了。最終定位到的是自己的mybatis的標(biāo)簽內(nèi)存在多余的標(biāo)點(diǎn) \\\" . \\\" 當(dāng)時(shí)都給尬笑了,還好解決了。

    2024年02月12日
    瀏覽(24)
  • spark sql 查看全部數(shù)據(jù)庫的表

    大數(shù)據(jù)環(huán)境下,metastore一般都交個(gè)hive處理,隨著數(shù)據(jù)庫 表 越來越多,進(jìn)行源數(shù)據(jù)管理的就會(huì)成為痛點(diǎn),如何能夠查詢出所有的數(shù)據(jù)庫下的所有表 Spark 官方文檔Tables 官方給的sample中,只能一個(gè)庫一個(gè)庫查詢,如果有成百上千個(gè)庫呢? 從 Python 3.6 開始,Python f 字符串可用。

    2024年02月14日
    瀏覽(21)
  • Flink---14、Flink SQL(SQL-Client準(zhǔn)備、流處理中的表、時(shí)間屬性、DDL)

    Flink---14、Flink SQL(SQL-Client準(zhǔn)備、流處理中的表、時(shí)間屬性、DDL)

    ?????????????????????? 星光下的趕路人star的個(gè)人主頁 ?????????????????????? 你生而真實(shí),而非完美 Table API和SQL是最上層的API,在Flink中這兩種API被集成在一起,SQL執(zhí)行的對(duì)象也是Flink中的表(Table),所以我們一般會(huì)認(rèn)

    2024年02月06日
    瀏覽(23)
  • 千萬級(jí)數(shù)據(jù)的表,我把慢sql優(yōu)化后性能提升30倍!

    千萬級(jí)數(shù)據(jù)的表,我把慢sql優(yōu)化后性能提升30倍!

    背景:系統(tǒng)中有一個(gè)統(tǒng)計(jì)頁面加載特別慢,前端設(shè)置的40s超時(shí)時(shí)間都加載不出來數(shù)據(jù),因?yàn)槭莻€(gè)統(tǒng)計(jì)頁面,基本上一猜就知道是mysql的語句有問題,遺留了很久沒有解決,正好趁不忙的時(shí)候,下定決心一定把它給搞定! (mysql5.7) 執(zhí)行一下問題sql,可以看到單表查就需要61s 這

    2024年02月14日
    瀏覽(21)
  • 查看SQL Server的表字段類型、長(zhǎng)度、描述以及是否可為null

    查看SQL Server的表字段類型、長(zhǎng)度、描述以及是否可為null

    本文參考:https://blog.csdn.net/josjiang1/article/details/80558068。 也可以直接點(diǎn)擊這里文章鏈接: sql server查詢表結(jié)構(gòu)(字段名,數(shù)據(jù)類型,長(zhǎng)度,描述,是否允許為空,是否為主鍵)。 小步測(cè)試 先查詢表的ID 2. 查詢表的信息 對(duì)于我來說足夠了。 組合一下 將上面兩句組合一下: 參

    2024年01月22日
    瀏覽(22)
  • Java解析SQL的基本思路

    天天在寫sql,一直很好奇sql到底咋解析的,于是隨便整個(gè)小demo。 比如sql是: 中間可能有1個(gè)或者多個(gè)空格,就想著怎么著也得有個(gè)分詞的類,就叫做Tokenizer吧。 這是一個(gè)名為Tokenizer的Java類,實(shí)現(xiàn)了Iterator接口。它用于將輸入的SQL語句進(jìn)行分詞。 構(gòu)造函數(shù)Tokenizer(String sql)接受

    2024年02月12日
    瀏覽(18)
  • Druid連接池工具公式化SQL附踩坑記錄

    使用Druid連接池工具格式化sql用于回顯時(shí)候美觀展示 之前我使用的是druid為1.2.4版本,在解析pg庫sql時(shí)候,發(fā)現(xiàn)執(zhí)行結(jié)果如下: 可以發(fā)現(xiàn),轉(zhuǎn)換函數(shù)::在解析時(shí)候異常了 切換高版本1.2.6及以上,可以正常解析。 druid的1.2.6以下版本對(duì)于包含數(shù)值使用::轉(zhuǎn)換為varchar的場(chǎng)景不支持,會(huì)

    2024年01月19日
    瀏覽(21)
  • 使用navicat利用sql語句查詢表所有字段的字段名,類型,長(zhǎng)度。

    使用navicat利用sql語句查詢表所有字段的字段名,類型,長(zhǎng)度。

    想要在navicat下,用sql語句查詢一個(gè)表的所有字段和其相關(guān)信息。 打開所需要查詢的表的數(shù)據(jù)庫 查新建詢 把下面的sql語句復(fù)制粘貼到新建的查詢編輯器中并修改庫名和表 這樣表的相關(guān)信息就會(huì)顯示出來了,將其選中,點(diǎn)擊鼠標(biāo)右鍵,——復(fù)制為——制表符分隔值(字段名和

    2023年04月08日
    瀏覽(121)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包