SQL解析器 JSqlParser

语法分析生成器

-- JavaCC    
   介绍:JavaCC是一个词法分析生成器和语法分析生成器
   TOP-DOWN:JavaCC产生自顶向下的语法分析器,而YACC等工具则产生的是自底向上的语法分析器。做词法分析
    输入文件是一个词法和语法的规范文件.jj,文件中词法和语法规则都写在其中
     在PARSER_BEGIN和PARSER_END之间定义语法解析器的主类,这是整个解析程序的入口,
       里面主要有一些引用的包和类以及一个main方法(其他的方法由JavaCC生成
    Apache Calcite是一个动态数据管理框架,它具备很多典型数据库管理系统的功能,比如SQL 解析、SQL校验、SQL查询优化、SQL生成以及数据连接查询等,基于JavaCC。
-- ANTLR(ANother Tool for Language Recognition)
   两种遍历树的机制:
      监听器 Listener extends BaseErrorListener  extends SqlBaseBaseListener
      访问器 Vistor pattern

SQL解析器

 01.JSqlParser  It is built using JavaCC
    net.sf.jsqlparser.parser.CCJSqlParserUtil   
 The method CCJSqlParserManager.parse  returns a class implementing Statement 
  which can be used to navigate the structure representing the SQL statement
 Jsqlparser对SQL的遍历采用了 VISITOR 模式, 遍历SQL语句比较方便
 应用场景: 状态过滤、权限过滤,表和字段血缘管理
02. Apache Calcite是一个动态数据管理框架,它具备很多典型数据库管理系统的功能,比如SQL 解析、SQL校验、SQL查询优化、SQL生成以及数据连接查询等,基于JavaCC。
3. fdb-sql-parser
4. 正则匹配的方法

开发

01.Maven依赖
 <dependency>
        <groupId>com.github.jsqlparser</groupId>
        <artifactId>jsqlparser</artifactId>
        <version>1.2</version>
 </dependency>
 02.源码
  文件:  JSqlParserCC.jjt
     /**
     * It represents an expression like "(" expression ")"
     */
    public class Parenthesis implements Expression {}
    public interface Expression {void accept(ExpressionVisitor expressionVisitor);}


    /**
     * The core of a "SELECT" statement (no UNION, no ORDER BY)
     */
    public class PlainSelect implements SelectBody {
        public Expression getWhere() {return where;}
        ……}
    public interface SelectBody {void accept(SelectVisitor selectVisitor);}
    public class Select implements Statement {}
    public interface Statement {void accept(StatementVisitor statementVisitor);}
03.具体概念
 Statement  SQL语句
     Select,Create,Drop,Insert,Delete等,它们作为Statement实现类,均实现accept方法
 Expression  
     ExpressionVisitor
 Visitor有StatementVisitor,SelectVisitor,ExpressionVisitor,SelectItemVisitor,FromItemVisitor
 CNFConverter :This class handles the conversion from a normal expression tree into the CNF form.
 SelectDeParser :
  A class to de-parse (that is, tranform from JSqlParser hierarchy into a string)
 // de为英语前缀,前缀de-来自拉丁语,意为"away from",de-还表示"除去"、"取消"以及"否定"、"非"、"相反"的意思

其他

Trie树,又叫做前缀树或者是字典树,是一种有序的树
 Observer - 观察者模式
 Listener - 监听模式
 Visitor  - 访问者
    访问操作独立出来变成一个新的类,当我们需要增加访问操作的时候,直接增加新的类,原来的代码不需要任何的改变。
    把结构和数据分开,编写一个访问者,去访问数据结构中的元素,然后把对各元素的处理全部交给访问者类
     Visitor 声明visit()  ConcreteVisitor 实现visit()
     Element 声明accept()  ConcreteElement  accept方法的实现 
     ObjectStructure

参考

https://www.programcreek.com/java-api-examples/?class=net.sf.jsqlparser.statement.select.PlainSelect&method=getGroupByColumnReferences
JSqlParser使用示例   https://zacard.net/2016/05/10/JSqlParser-examples/
https://www.programcreek.com/java-api-examples/index.php?api=net.sf.jsqlparser.parser.CCJSqlParserUtil
SQL解析(Jsqlparser) http://itsolife.com/2014/02/02/2014-02-02-JavaJ2EE-SQL_Java--SQL%E8%A7%A3%E6%9E%90Jsqlparser/
jsqlParse分析SQL https://www.jianshu.com/p/988229bb82b7
使用Jsqlparser从复杂SQL语句中提取表名 http://www.findsrc.com/java/detail/8640

blogroll

social