栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

提取SQL中的表名称与列名称

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

提取SQL中的表名称与列名称

 1、增加pom依赖


    com.alibaba
    druid
    ${druid.version}
1.2.9
import com.alibaba.druid.DbType;
        import com.alibaba.druid.sql.SQLUtils;
        import com.alibaba.druid.sql.ast.SQLStatement;
        import com.alibaba.druid.sql.ast.statement.SQLAlterTableStatement;
        import com.alibaba.druid.sql.ast.statement.SQLDeleteStatement;
        import com.alibaba.druid.sql.ast.statement.SQLSelectStatement;
        import com.alibaba.druid.sql.dialect.hive.ast.HiveInsertStatement;
        import com.alibaba.druid.sql.dialect.hive.visitor.HiveSchemaStatVisitor;
        import com.alibaba.druid.stat.TableStat;
        import lombok.extern.slf4j.Slf4j;

        import java.util.*;


@Slf4j
public class SqlUtils {

    public static List getTableNameList(String sql) {
        List res = new ArrayList<>();
        try {
            List sqlStatements = SQLUtils.parseStatements(sql, DbType.hive);
            for (SQLStatement sqlStatement : sqlStatements) {
                HiveSchemaStatVisitor sqlastVisitor = new HiveSchemaStatVisitor();
                if (sqlStatement instanceof SQLSelectStatement) {
                    SQLSelectStatement sqlSelectStatement = (SQLSelectStatement) sqlStatement;
                    sqlSelectStatement.accept(sqlastVisitor);
                } else if (sqlStatement instanceof HiveInsertStatement) {
                    HiveInsertStatement sqlInsertStatement = (HiveInsertStatement) sqlStatement;
                    sqlInsertStatement.accept(sqlastVisitor);
                } else if (sqlStatement instanceof SQLDeleteStatement) {
                    SQLDeleteStatement sqlDeleteStatement = (SQLDeleteStatement) sqlStatement;
                    sqlDeleteStatement.accept(sqlastVisitor);
                }else if (sqlStatement instanceof SQLAlterTableStatement) {
                    SQLAlterTableStatement sqlAlterTableStatement = (SQLAlterTableStatement) sqlStatement;
                    sqlAlterTableStatement.accept(sqlastVisitor);
                }
                //获取表列表
                Map tables = sqlastVisitor.getTables();
                for (Map.Entry nameTableStatEntry : tables.entrySet()) {
                    res.add(nameTableStatEntry.getKey().getName());
                }
                //获取列列表
                Collection columnCollection =  sqlastVisitor.getColumns();
                columnCollection.forEach(column->{
                    log.info("tableName:{},columnName:{},iswhere:{}",column.getTable(),column.getName(),column.isWhere());
                });
            }
        } catch (Exception e) {
            log.error("sql解析错误sql:{},错误原因:{}", sql, e.getMessage());
            if (e.getMessage().contains("token IDENTIFIER serdeproperties")) {
                String tempSql = sql.replaceAll(" ","").toLowerCase(Locale.ROOT);
                int start = tempSql.indexOf("altertable") + 10;
                int end = tempSql.indexOf("setserdeproperties(");
                res.add(tempSql.substring(start, end));
            }
        }
        return res;
    }

    public static void main(String[] args) {
        String sql = "select * from dba.test where AVAILABLE = '0'";
        System.out.println(getTableNameList(sql));
    }
}

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/880550.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号