【基于druid 支持select sql库名及表名映射】

基于druid 支持select sql库名及表名映射

package org.example;

import com.alibaba.druid.DbType;
import com.alibaba.druid.sql.SQLUtils;
import com.alibaba.druid.sql.ast.SQLExpr;
import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr;
import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr;
import com.alibaba.druid.sql.ast.statement.SQLExprTableSource;
import com.alibaba.druid.sql.ast.statement.SQLSelectItem;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectQueryBlock;
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitorAdapter;

import java.util.HashMap;
import java.util.List;
import java.util.Map;


public class DruidTest {

    public static class MySqlExportTableAliasVisitor extends MySqlASTVisitorAdapter {
        Map<String, String> schemaMapping = new HashMap<>();
        Map<String, String> tableMapping = new HashMap<>();

        public MySqlExportTableAliasVisitor(Map<String, String> schemaMapping, Map<String, String> tableMapping) {
            this.schemaMapping = schemaMapping;
            this.tableMapping = tableMapping;
        }

        @Override
        public boolean visit(MySqlSelectQueryBlock x) {
            for (SQLSelectItem selectItem : x.getSelectList()) {
                SQLExpr sqlExpr = ((SQLPropertyExpr) selectItem.getExpr()).getOwner();

                if (sqlExpr instanceof SQLPropertyExpr) {
                    String tableName = ((SQLPropertyExpr) sqlExpr).getName();
                    ((SQLPropertyExpr) sqlExpr).setName(tableMapping.getOrDefault(tableName, tableName));

                    SQLIdentifierExpr schema = (SQLIdentifierExpr) ((SQLPropertyExpr) sqlExpr).getOwner();
                    if (schema != null) {
                        schema.setName(schemaMapping.getOrDefault(schema.getName(), schema.getName()));
                    }
                } else if (sqlExpr instanceof SQLIdentifierExpr) {
                    SQLIdentifierExpr sqlIdentifierExpr = ((SQLIdentifierExpr) sqlExpr);
                    sqlIdentifierExpr.setName(tableMapping.getOrDefault(sqlIdentifierExpr.getName(), sqlIdentifierExpr.getName()));
                }
            }
            return true;
        }

        @Override
        public boolean visit(SQLExprTableSource x) {
            x.setSchema(schemaMapping.getOrDefault(x.getSchema(), x.getSchema()));
            if (x.getExpr() instanceof SQLPropertyExpr) {
                SQLPropertyExpr sqlPropertyExpr = (SQLPropertyExpr) x.getExpr();
                sqlPropertyExpr.setName(tableMapping.getOrDefault(x.getTableName(), x.getTableName()));
            } else if (x.getExpr() instanceof SQLIdentifierExpr) {
                SQLIdentifierExpr sqlIdentifierExpr = (SQLIdentifierExpr) x.getExpr();
                sqlIdentifierExpr.setName(tableMapping.getOrDefault(x.getTableName(), x.getTableName()));
            }
            return true;
        }
    }


    public static void main(String[] args) {
//        String sql = "select `test_01`.`id` AS `id`,`test_01`.`a` AS `a` from `test_01`";
        String sql = "select `hy_test_0`.`test_01`.`id` AS `id`,`hy_test_0`.`test_01`.`a` AS `a` from `hy_test_0`.`test_01`";

        Map<String, String> schemaMapping = new HashMap<>();
        schemaMapping.put("`hy_test_0`", "`hy_test_1`");

        Map<String, String> tableMapping = new HashMap<>();
        tableMapping.put("`test_01`", "`new_test_01`");
        List<SQLStatement> stmtList = SQLUtils.parseStatements(sql, DbType.mysql);
        MySqlExportTableAliasVisitor visitor = new MySqlExportTableAliasVisitor(schemaMapping, tableMapping);
        for (SQLStatement stmt : stmtList) {
            stmt.accept(visitor);
        }
        String handleSQL = SQLUtils.toSQLString(stmtList, DbType.mysql);

        System.out.println(handleSQL);
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是使用Druid解析SQL的Java代码,可以解析MySQL、ClickHouse和Elasticsearch的SQL语句,并输出SQL依赖的库名和表名。 ```java import com.alibaba.druid.sql.SQLUtils; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; import com.alibaba.druid.sql.ast.statement.*; import com.alibaba.druid.sql.dialect.clickhouse.parser.ClickhouseStatementParser; import com.alibaba.druid.sql.dialect.elasticsearch.parser.ElasticsearchStatementParser; import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser; import com.alibaba.druid.sql.parser.SQLParserUtils; import com.alibaba.druid.sql.parser.SQLStatementParser; import com.alibaba.druid.util.JdbcConstants; public class SqlParser { public static void main(String[] args) { String sql = "SELECT * FROM mydb.mytable WHERE id = 1"; String dbType = JdbcConstants.MYSQL; // 支持数据库类型:MYSQL、CLICKHOUSE、ELASTICSEARCH SQLStatementParser parser = null; switch (dbType) { case JdbcConstants.MYSQL: parser = new MySqlStatementParser(sql); break; case JdbcConstants.CLICKHOUSE: parser = new ClickhouseStatementParser(sql); break; case JdbcConstants.ELASTIC_SEARCH: parser = new ElasticsearchStatementParser(sql); break; default: throw new RuntimeException("不支持数据库类型:" + dbType); } SQLStatement statement = parser.parseStatement(); if (statement instanceof SQLSelectStatement) { SQLSelectStatement selectStatement = (SQLSelectStatement) statement; SQLSelectQuery query = selectStatement.getSelect().getQuery(); if (query instanceof SQLSelectQueryBlock) { SQLSelectQueryBlock queryBlock = (SQLSelectQueryBlock) query; SQLTableSource tableSource = queryBlock.getFrom(); while (tableSource instanceof SQLJoinTableSource) { SQLJoinTableSource joinTableSource = (SQLJoinTableSource) tableSource; tableSource = joinTableSource.getLeft(); } if (tableSource instanceof SQLExprTableSource) { SQLExprTableSource exprTableSource = (SQLExprTableSource) tableSource; SQLExpr expr = exprTableSource.getExpr(); if (expr instanceof SQLIdentifierExpr) { SQLIdentifierExpr identifierExpr = (SQLIdentifierExpr) expr; String tableName = identifierExpr.getName(); String schemaName = identifierExpr.getResolvedOwnerName(); System.out.println("依赖库名:" + schemaName); System.out.println("依赖表名:" + tableName); } } } } } } ``` 你可以将上述代码保存为`SqlParser.java`文件,然后通过命令行编译运行: ```bash $ javac -cp druid-1.2.5.jar SqlParser.java $ java -cp druid-1.2.5.jar:. SqlParser ``` 注意:需要将`druid-1.2.5.jar`放在当前目录下,并且需要在命令行中指定类路径`-cp`。另外,代码中的SQL语句可以替换为你需要解析SQL语句。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值