使用druid解析sql,如表名,字段等

测试代码

 /**
     * druid sql解析
     */
    public void getTableNamesFromSql(){
        String sql = "select gender,email,phone,address from table1 where id = 3 and name = 'dave'";
        //String sql = "selec gender,email,phone,address from table1";
        //选择数据源类型,这里以mySql为例
        //String dbType = JdbcConstants.ODPS;
        String dbType = JdbcConstants.MYSQL;
        try {
            List<String> tableNameList = new ArrayList<>();
            //格式化输出
            String sqlResult = SQLUtils.format(sql, dbType);
            log.info("格式化后的sql:[{}]",sqlResult);

            List<SQLStatement> stmtList = null;
            try {
                stmtList = SQLUtils.parseStatements(sql, dbType);
            } catch (ParserException e) {
                log.error("sql语法有误,请检查sql:{}",e.getMessage());
               return;
               // e.printStackTrace();
            }
            if (CollectionUtils.isEmpty(stmtList)) {
                log.info("stmtList为空无需获取");
            }
            //解析sql,获取表名
            for (SQLStatement sqlStatement : stmtList) {
                //mysql为例,若为其他数据源请换成对应的SchemaStatVisitor
                MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor();
               // OdpsSchemaStatVisitor visitor = new OdpsSchemaStatVisitor();
                sqlStatement.accept(visitor);
                //获取表名
                Map<TableStat.Name, TableStat> tables = visitor.getTables();
                log.info("druid解析sql的结果集:[{}]",tables);
                Set<TableStat.Name> tableNameSet = tables.keySet();
                for (TableStat.Name name : tableNameSet) {
                    String tableName = name.getName();
                    if (StringUtils.isNotBlank(tableName)) {
                        tableNameList.add(tableName);
                    }
                }
                //获取where条件
                List<TableStat.Condition> conditions = visitor.getConditions();
                log.info("解析sql后的查询条件:{}",conditions);
                //获取查询字段
                Collection<TableStat.Column> columns = visitor.getColumns();
                log.info("解析sql后的字段:{}",columns);

            }

            //解析sql中表名
            log.info("解析sql后的表名:[{}]",tableNameList);
        } catch (Exception e) {
            log.error("**************异常SQL:[{}]*****************\\n",sql);
            log.error(e.getMessage(),e);
        }
    }

运行结果

在这里插入图片描述

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,我可以为您解答这个问题。首先,为了使用 Druid 实现 SQL 血缘关系解析,您需要先配置 Druid 数据源,并使用 Druid 提供的 SQL Parser 解析 SQL 语句,然后根据解析结果进行血缘关系的分析。 以下是一个使用 Druid 解析 SQL 的示例代码: ```java import com.alibaba.druid.sql.SQLUtils; import com.alibaba.druid.sql.ast.SQLStatement; import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; import com.alibaba.druid.sql.ast.statement.SQLSelect; import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser; import com.alibaba.druid.sql.parser.SQLStatementParser; public class SQLParserDemo { public static void main(String[] args) { String sql = "SELECT t1.id, t1.name, t2.age FROM table1 t1 JOIN table2 t2 ON t1.id = t2.id WHERE t1.age > 18"; SQLStatementParser parser = new MySqlStatementParser(sql); SQLStatement statement = parser.parseStatement(); if (statement instanceof SQLSelect) { SQLSelect select = (SQLSelect) statement; select.getSelectList().forEach(item -> { if (item.getExpr() instanceof SQLIdentifierExpr) { String fieldName = ((SQLIdentifierExpr) item.getExpr()).getName(); String tableName = item.getParent().getParent().toString(); System.out.println(fieldName + " --> 来源于 " + tableName); } }); } } } ``` 在这个示例代码中,我们使用 DruidSQL Parser 解析 SQL 语句,并提取出 SELECT 语句中的字段名和名,最后输出字段名和来源名的血缘关系。 需要注意的是,这个示例代码只能解析 SELECT 语句中的字段血缘关系,如果您需要解析更复杂的 SQL 语句血缘关系,需要根据具体情况进行相应的修改。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值