?文章來源地址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上完成。
?
二、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é)果?
?
對(duì)于MLSQL JDBC的表列信息解析依賴于Druid,因此語法支持受限于Druid,目前Druid的支持如下:
數(shù)據(jù)庫 | DML | DDL |
odps | 完全支持 | 完全支持 |
mysql | 完全支持 | 完全支持 |
postgresql | 完全支持 | 完全支持 |
oracle | 支持大部分 | 支持大部分 |
sql server | 支持常用的 | 支持常用的 |
db2 | 支持常用的 | 支持常用的 |
hive | 支持常用的 | 支持常用的 |
四、源碼支持DB類型?
目前我用的Druid是1.2.18目前源碼支持的dbType類型如下
?文章來源:http://www.zghlxwxcb.cn/news/detail-660320.html
?
到了這里,關(guān)于使用Druid解析SQL,獲取SQL中所有使用的表的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!