antlr解析SQL整合idea开发入门

一、idea安装antlr插件

下载antlr的地址:
https://plugins.jetbrains.com/plugin/7358-antlr-v4/versions/stable
根据idea的版本,下载对应的antlr的jar包
在这里插入图片描述

下载后的文件是
在这里插入图片描述

或者这个地址进行搜索也可以
https://plugins.jetbrains.com/
在这里插入图片描述

1.2、在idea中安装antrl插件
在这里插入图片描述
在这里插入图片描述

二、创建mysql.g4文件以MySQL为例

必须要创建分词规则文件是.g4的后缀名文件,
在这里插入图片描述
分词规则模板在github上有,官网给的模板解析功能很全,不建议自己写
https://github.com/antlr/grammars-v4/tree/master/sql/mysql/Positive-Technologies
MySqlLexer.g4和MySqlParser.g4

如果网速太慢可以用这个科学上网,有免费和付费
https://ikuuu.me/auth/register?code=Jae9

在MySQL.g4文件右键,点击configure ANTLR
在这里插入图片描述
选择生成的代码要保存的位置
在这里插入图片描述
填写的内容分别为:
1、生成代码位置
2、使用规则源文件存放位置,就是自己下载的模板文件路径
3、包名,写代码引用的时候会用到
4、自动生成代码语言,这里写Java
默认生成的java文件太大需要改一下idea配置文件

生成java代码,这2个文件都必须要生成MySqlLexer.g4和MySqlParser.g4文件,不能缺少没有先后顺序,但是必须都需要生成java代码
在这里插入图片描述
把生成的代码拷贝到对应的包下
在这里插入图片描述
默认生成的java文件太大需要改一下idea配置文件
在这里插入图片描述
修改help-》edit custom properties…
在这里插入图片描述
增加一行:idea.max.intellisense.filesize=5000
在这里插入图片描述

三、测试解析SQL

3.1、创建 Listener的MySQLQueryListener.java 文件:

public class MySQLQueryListener extends MySqlParserBaseListener {
    private final Set<String> tableNameSet = new HashSet<String>();
    private final Set<String> selectElementTreeSet = new TreeSet<>();
    @Override
    public void enterSelectElements(MySqlParser.SelectElementsContext ctx) {
        selectElementTreeSet.add(ctx.getText());
//        System.out.println("查询字段:" + ctx.getText());
    }
    @Override
    public void enterTableName(MySqlParser.TableNameContext ctx) {
        tableNameSet.add(ctx.getText());
//        System.out.println("查询表: " + ctx.getText());
    }
    public Set<String> getTableNameSet() {
        return tableNameSet;
    }
    public Set<String> getSelectElementTreeSet() {
        return selectElementTreeSet;
    }
}

3.2、测试代码

// A code block
var foo = 'bar';

public class MySQLQueryDemo {
public static void main(String[] args) throws Exception {
// 输入SQL语句
String sql = “SELECT concat(aa.TABLE_SCHEMA,‘.’,aa.TABLE_NAME) as id,aa.TABLE_NAME,aa.TABLE_SCHEMA,aa.TABLE_COMMENT,aa.TABLE_ROWS,aa.TABLE_TYPE,bb.COLUMN_NAMES FROM information_schema.TABLES aa inner join (select TABLE_SCHEMA,TABLE_NAME,CONCAT(GROUP_CONCAT( DISTINCT CONCAT(COLUMN_NAME,’ ‘, COLUMN_TYPE,IF(COLUMN_DEFAULT IS NULL, ‘’, CONCAT(’ DEFAULT ‘, COLUMN_DEFAULT)),IF(IS_NULLABLE = ‘NO’, ’ NOT NULL’, ‘’),IF(COLUMN_COMMENT = ‘’, ‘’, CONCAT(’ COMMENT ‘’‘, COLUMN_COMMENT, ‘’’')) ) ORDER BY ORDINAL_POSITION SEPARATOR ',' )) as COLUMN_NAMES from information_schema.columns` group by TABLE_SCHEMA,TABLE_NAME ) bb on aa.TABLE_SCHEMA=bb.TABLE_SCHEMA and aa.TABLE_NAME=bb.TABLE_NAME WHERE aa.TABLE_SCHEMA=‘111’”;
MySqlLexer lexer = new MySqlLexer(CharStreams.fromString(sql));
MySqlParser parser = new MySqlParser(new CommonTokenStream(lexer));
MySqlParser.SelectStatementContext ctx = parser.selectStatement();
MySQLQueryListener listener = new MySQLQueryListener();
ParseTreeWalker.DEFAULT.walk(listener, ctx);
Set selectElementTreeSet = listener.getSelectElementTreeSet();
String element = (String) selectElementTreeSet.toArray()[selectElementTreeSet.size() - 1];
System.out.println(“表字段:”+element);
Set tableNameSet = listener.getTableNameSet();
for (int i = 0; i < tableNameSet.size(); i++) {
System.out.println(“查询表:”+tableNameSet.toArray()[i]);
}
}
}

3.3、添加pom依赖文件

<dependency>
    <groupId>org.antlr</groupId>
    <artifactId>antlr4-runtime</artifactId>
    <version>4.13.2</version>
</dependency>

3.4、运行结果
在这里插入图片描述

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐