博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JSqlParser系列之二代码结构(原)
阅读量:5239 次
发布时间:2019-06-14

本文共 2730 字,大约阅读时间需要 9 分钟。

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

 

转载于:https://www.cnblogs.com/liuwt0911/p/4420472.html

你可能感兴趣的文章
android一些细节问题
查看>>
KDESVN中commit时出现containing working copy admin area is missing错误提示
查看>>
利用AOP写2PC框架(二)
查看>>
【动态规划】skiing
查看>>
java定时器的使用(Timer)
查看>>
Android实现静默安装与卸载
查看>>
ef codefirst VS里修改数据表结构后更新到数据库
查看>>
boost 同步定时器
查看>>
[ROS] Chinese MOOC || Chapter-4.4 Action
查看>>
简单的数据库操作
查看>>
解决php -v查看到版本与phpinfo()版本不一致问题
查看>>
iOS-解决iOS8及以上设置applicationIconBadgeNumber报错的问题
查看>>
亡灵序曲-The Dawn
查看>>
MySQL中的隔离级别和悲观锁及乐观锁示例
查看>>
手机端h5 ajax 上传图片支持微信内置浏览器
查看>>
Redmine
查看>>
HtmlEditor常用模式
查看>>
Another app is currently holding the yum lock; waiting for it to exit.. yum被锁定无法使用
查看>>
帧的最小长度 CSMA/CD
查看>>
xib文件加载后设置frame无效问题
查看>>