zoukankan      html  css  js  c++  java
  • JSqlParser系列之二代码结构(原)

    JSqlParser系列之二代码结构(原)

    博客园 百味木屋原创,转载请注明出处。

    上一篇文章简单介绍如何建立JSqlParser工程,本章对JSqlParser工程的代码结构作大致地介绍。

    一、目录结构

        

          JSqlParser的目录结构比较简单,主要有表达式,解析器,语句处理几个目录。下面这张图给出了一个具体的SQL语句与表达式:

    接下来,简要介绍一下在JSqlParser中几个抽象概念。

    二、SQL语句(statement)

         JSqlPaser将所有的SQL语句抽象为Statement,Statement表示对数据库的一个操作。

    package net.sf.jsqlparser.statement;
    
    /**
     * An operation on the db (SELECT, UPDATE ecc.)
     */
    public interface Statement {
    
        void accept(StatementVisitor statementVisitor);
    }

            常见的Statement有:Select,Create,Drop,Insert,Delete等,它们作为Statement实现类,均实现accept方法。这是Visitor模式的典型应用,贯穿JSqlParser解析SQL语句的每个角落。这里你只需要知道Statement对应StatementVisitor。如果要针对SQL语句进行定制化处理,你只需实现StatementVisitor接口即可。

           以查询语句(Select)为例,下面是Select类的方法截图:

      

    可以看到,Select对象有两个重要的成员:SelectBody,List<WithItem>,其中WithItem对应SQL语句的with关键字,并不多见。可见常用Select语句的重点在SelectBody。SelectBody是一个接口,定义如下:

    package net.sf.jsqlparser.statement.select;
    
    public interface SelectBody {
    
        void accept(SelectVisitor selectVisitor);
    }

    又是一个Visitor,只不过这里换成了SelectVisitor。即针对Select语句的访问者。如果想定制化解析Select语句,可以实现该接口。

    Select语句进一步细分,大致可发表示如下:

    select    SelectItem   from   FromItem   where   Expression

    其中SelectItem表示要选择的内容:

    /**
     * Anything between "SELECT" and "FROM"<BR>
     * (that is, any column or expression etc to be retrieved with the query)
     */
    public interface SelectItem {
    
        void accept(SelectItemVisitor selectItemVisitor);
    }

    FromItem表示数据来源(表或者嵌入选择语句)

    package net.sf.jsqlparser.statement.select;
    
    import net.sf.jsqlparser.expression.Alias;
    
    /**
     * An item in a "SELECT [...] FROM item1" statement. (for example a table or a
     * sub-select)
     */
    public interface FromItem {
    
        void accept(FromItemVisitor fromItemVisitor);
    
        Alias getAlias();
    
        void setAlias(Alias alias);
    
        Pivot getPivot();
    
        void setPivot(Pivot pivot);
    
    }

    可以看到,SelectItem解析的时候会用到SeletItemVisitor,FromItem解析的时候会用到FromItemVisitor,模式都是相同的。
    Expression稍微复杂一些,下面单独介绍。

    三、表达式(expression)

    SQL解析过程中, 条件的解析最为复杂。JSqlParser把where 与order by 之间的条件表达式抽象有Exception。

    package net.sf.jsqlparser.expression;
    
    public interface Expression {
    
        void accept(ExpressionVisitor expressionVisitor);
    }

    哈哈,又看到一个ExpressionVisitor,是不是觉得JSqlParser的思路还蛮简洁的。
    Expression进一步细分成好多种,常见的有:

    1、条件表达式

    如:AndExpression(and),OrExpression(or)

    2、关系表达式

    如:EqualsTo(=),MinorThan(<),GreaterThan(>),……

    3、算术表达式

    如:Addition(+),Subtraction(-),Multiplication(*),Division(/),……

    4、列表达式

    如:Column

    5、case表达式

    如:CaseExpression

    6、值表达式

    如:StringValue,DateValue,LongValue,DoubleValue,……

    7、函数表达式

    如:Function

    8、参数表达式

    如:JdbcParameter,JdbcNameParameter,……

    如果要定制ExpressionVisitor,针对上面不同的表达式,应该给出相应的处理。

    四、访问者(Visitor)

    上面已经提到,常用的Visitor有StatementVisitor,SelectVisitor,ExpressionVisitor,SelectItemVisitor,FromItemVisitor等,定制化解析具体某一块SQL语句时,需要定制相关的Visitor。关于Visitor模式,本来想单独写一篇介绍,结果发现园子里的前辈已经写了很多,这里给出几篇链接,供参考:

    设计模式(20)-Visitor Pattern

    让我再罗嗦一下Visitor模式

    设计模式随笔-让众口不再难调

    其中,最后一篇关于自助餐的实例,非常经典,看了之后对Visitor模式理解比较深刻。

  • 相关阅读:
    glib 库 hash table 使用
    git 使用
    centos6.5 下安装 sqlplus
    Oracle tns 协议
    unix环境高级编程附录 B 通用代码
    centos6.5安装gtk开发环境
    linux 下定位程序假死
    Kotlin与Android SDK 集成(KAD 05)
    Kotlin的android扩展:对findViewById说再见(KAD 04)
    Kotlin类:功能更强、而更简洁(KAD 03)
  • 原文地址:https://www.cnblogs.com/liuwt0911/p/4420472.html
Copyright © 2011-2022 走看看