获取SQL语句表名,判断DDL类型

1.在maven中引入jsqlparser依赖

	
		
			com.github.jsqlparser
			jsqlparser
			4.4
		

2.解析SQL语句具体代码

此代码解析了sql语句,并且判断ddl类型是否是create,如果是create就查出表名

 public List getTableInfo(String sqlDDl) {
        //解析数据库获取表名
        List tableList = new ArrayList<>();
        try {
            Statements statements = CCJSqlParserUtil.parseStatements(sqlDDl);
            TablesNamesFinder tablesNamesFinder = new TablesNamesFinder();
            logger.info("statement->{}", statements);
            if (CollectionUtils.isNotEmpty(statements.getStatements())) {
                statements.getStatements().forEach(statement -> {
                 //判断ddl类型是否是create类型 ,如果想获取ddl所有语句的表名,这条代码去掉
                    if (statement instanceof CreateTable) {
                        List tableList1 = tablesNamesFinder.getTableList(statement);
                        if (CollectionUtils.isNotEmpty(tableList1)) {
                            tableList.add(tableList1.get(0));
                            logger.info("table->{}", tableList1);
                        }
                    }
                });
            }
        } catch (JSQLParserException e) {
            e.printStackTrace();
            }
            }
            

3.解析SQL语句, 获取表名

获取SQL语句表名,判断DDL类型_第1张图片

4.如果是hive语句,带有特殊字符解析会报错,用正则表达式去除

 @Test
    public void senDdlMq() {
        String sqlDDl = "drop table if exists test_table05;" +
                "\ncreate table test_table05 (\nid int comment '自增ID',\nphone varchar(255) comment '手机号'" +
                ") " +
                "row FORMAT DELIMITED FIELDS TERMINATED by ',' stored AS textfile;";
        sqlDDl = sqlDDl.replaceAll("\r|\n"," ");
        sqlDDl = sqlDDl.replaceAll("(?i)ROW.*?(?=;)", " ");
        logger.info("sqlDDl:"+sqlDDl);
        List tableInfo = getTableInfo(sqlDDl);

    }

获取SQL语句表名,判断DDL类型_第2张图片
“ . ”表示任意字符,“ ? ”表示匹配一次或多次,“ ?<=A ” 表示以A开头、不替换A,“ ?=B ”表示以B结尾、不替换B,“(?i)”表示不区分大小写

你可能感兴趣的:(sql,数据库)