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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM