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" * (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模式,本来想单独写一篇介绍,结果发现园子里的前辈已经写了很多,这里给出几篇链接,供参考:
其中,最后一篇关于自助餐的实例,非常经典,看了之后对Visitor模式理解比较深刻。