先上結論。
功能上:druid sql parser(支持分區、WITH、DUAL等。使用mysql語法解析時,已知oracle的一些操作符會被轉為mysql,如|| 轉為OR。使用oracle解析器時,union all里面的括號會被移到外面,從而導致可能執行出錯) > jsqlparser(不支持分區及((id)) in ((?))) > fdb-sql-parser(不支持很復雜的SQL)。因此,首先排除fdb-sql-parser。都不支持不執行SQL語句解析語義,可通過調用preparestatement達到目標(我們就是這么做的),不是問題。
-- druid能解析、jsqlparser解析不了 SELECT * FROM ( SELECT * FROM biz_fund_info WHERE tenant_code = ? AND ( (ta_code, manager_code) IN ((?,?)) OR department_type IN (?) ) )
易用性:jsqlparser > druid sql parser(文檔和javadoc實在TMD懶了)。就druid sql parser和jsqlparser而言,核心只要理解訪問者模式,其中核心又為com.alibaba.druid.sql.dialect.mysql.visitor.MySqlOutputVisitor#visit及其父類,使用例子可以參見https://www.jianshu.com/p/3fb67691d3c8。


可見差異不要太大,如果兩個都上的話,不能說不行,其實成本有點高(不過LZ確實兩個都廣泛在框架里使用了,主要是jsqlparser先上的,一下子也沒時間完全重構,而且druid sql parser也有一些實現不合理的地方,比如子查詢的toString並不是原sql的子集,多了額外的\t或\n)。
所以,如果需要廣泛使用,可考慮優先選擇druid sql parser而不是jsqlparser。
注:除了自己寫過濾器外,druid也支持sql注入過濾器,可參考:https://my.oschina.net/yysue/blog/1618558,https://www.oschina.net/question/928524_106630
druid sql parser的官方文檔:https://github.com/alibaba/druid/wiki/SQL-Parser。后續補充實戰手冊,我們在分布式查詢引擎的重寫、分庫分表合並、用戶名映射、基於sql自動生成智能的查詢頁面都是基於druid擴展實現的(一開始用jsqlparser,但是在解析方面相比druid sql parser偏弱,后面大部分用druid重寫了)。
jsqlparser官方文檔:http://jsqlparser.sourceforge.net/example.php
最后,這倆都是通過自己從頭到尾解析實現AST,sharding-jdbc采用的是antlr實現的(其實就是分庫分表中間件來說,借助jsqlparser和druid也差不多了,重點本身是merge和pushdown重寫,並非解析)。
除了這兩個主流的外,還有一個apache calcite,LZ沒有研究過,可見https://www.cnblogs.com/zhihuifan10/p/11124724.html。
