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

页面导航:首页 > 网络编程 > JavaScript > JSqlParser系列之二代码结构(原)

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

来源: 作者: 时间:2016-02-02 09:58 【

JSqlPaser将所有的SQL语句抽象为Statement,Statement表示对数据库的一个操作。package net sf jsqlparser statement; *** An operation on the db (SELECT, UPDATE ecc )* public interface Stateme
 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。
Tags:

文章评论

最 近 更 新
热 点 排 行
Js与CSS工具
代码转换工具

<