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模式,本來想單獨寫一篇介紹,結果發現園子里的前輩已經寫了很多,這里給出幾篇鏈接,供參考:
其中,最后一篇關於自助餐的實例,非常經典,看了之后對Visitor模式理解比較深刻。