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模式理解比较深刻。

 

posted @ 2015-04-12 21:55  刘文涛  阅读(23842)  评论(2编辑  收藏  举报