使用Druid解析SQL小試

這是學習筆記的第 1862篇文章java


Druid在行業內是一個很流行的開源工具,在不少開發項目裏的數據源選型都是它,按照官方的參考數據,Druid的性能很是好,都是納秒級別。mysql

GitHub上Druid的星有一萬多,光提交的issue就有1000多個,可見在社區裏面也算是久經沙場了。sql



Druid和開發方向關係比較緊密,和DBA方向有什麼關係呢。其實仍是迴歸到本質,和SQL有關,在SQL方向目前存在幾個瓶頸。 數據庫

  1. 行業內的審覈工具對於DML的支持頗有限。微信

  2. 開源工具和數據庫的綁定比較緊,不夠通用,難以實現SQL方言化解析.maven

  3. 語法和詞法分析是一個技術活,單純分析文本作解析簡單粗暴,沒有體系化就難以實現擴展。工具

鑑於目前MySQL方向走得快一些,其餘方向的事務性工做依舊繁瑣,因此我但願在已有的基礎上作一個大的改變,那就是SQL審覈2.0版本,經過提供通用的技術體系來支撐通用的數據庫規範。性能

Druid不光做爲一個通用的數據源性能優越,並且裏面也內置了大量的輔助功能。 其實看到Druid實現的demo,會發現它早已超出了自己的定位,能夠作一些監控和優化,還有SQL解析器。學習

咱們能夠徹底站在巨人的肩膀上,把這些信息繼承起來,而後融入咱們自定義的邏輯來知足當前的業務需求。 優化


若是你不熟悉Java,按照GitHub的方式來編譯Druid,這應該會是一個很差的開始。 

由於擺在你面前的第一道門檻就是maven,其實maven就是一個檔案庫,咱們能夠從裏面提取獲得相關的軟件。對於maven,就相似於咱們使用yum的方式是相似的。

咱們要建立一個java項目,以maven的方式建立。 

在pom.xml引入以下的依賴便可。 

<dependencies>
<dependency>
   <groupId>com.alibaba</groupId>
   <artifactId>druid</artifactId>
   <version>1.1.10</version>
</dependency>
</dependencies>


新建一個Java文件,代碼相似下面的形式。

import java.util.List;
import com.alibaba.druid.sql.SQLUtils;
import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlSchemaStatVisitor;
import com.alibaba.druid.util.JdbcConstants;
/**
* Hello world!
*
*/
public class Test {

public static void main(String[] args) {

//String sql = "update t set name = 'x' where id < 100 limit 10";
       // String sql = "SELECT ID, NAME, AGE FROM USER WHERE ID = ? limit 2";
       // String sql = "select * from tablename limit 10";
       String sql = "CREATE TABLE `define_cdetag` (\n" +
"  `id` int(32) unsigned NOT NULL COMMENT '配置項使用時標識',\n" +
"  `thiSection` varchar(32) DEFAULT NULL COMMENT 'StageID白名單區間',\n" +
"  `thiExceptList` text COMMENT 'test名單列表',\n" +
"  PRIMARY KEY (`id`)\n" +
") ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='test';";
       String dbType = JdbcConstants.MYSQL;
       //格式化輸出
       String result = SQLUtils.format(sql, dbType);
       System.out.println(result); // 缺省大寫格式
       List<SQLStatement> stmtList = SQLUtils.parseStatements(sql, dbType);
       //解析出的獨立語句的個數
       System.out.println("size is:" + stmtList.size());
       for (int i = 0; i < stmtList.size(); i++) {

SQLStatement stmt = stmtList.get(i);
           MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor();
           stmt.accept(visitor);
           //獲取表名稱
           //System.out.println("Tables : " + visitor.getCurrentTable());
           //獲取操做方法名稱,依賴於表名稱
           System.out.println("Manipulation : " + visitor.getTables());
           //獲取字段名稱
           System.out.println("fields : " + visitor.getColumns());
           System.out.println(visitor.getColumn("define_cdetag","thiSection").getDataType());
           System.out.println(visitor.getColumn("define_cdetag","thiSection").getFullName());
           System.out.println(visitor.getColumn("define_cdetag","id").isPrimaryKey());
           System.out.println(visitor.getTableStat("define_cdetag"));
       }

}

}

程序的輸入以下,能夠看到能夠解析到字段信息,主鍵信息

CREATE TABLE `define_cdetag` (
`id` int(32) UNSIGNED NOT NULL COMMENT '配置項使用時標識',
   `thiSection` varchar(32) DEFAULT NULL COMMENT 'StageID白名單區間',
   `thiExceptList` text COMMENT 'test名單列表',
   PRIMARY KEY (`id`)
) ENGINE = InnoDB CHARSET = utf8 COMMENT 'test';
   size is:1
   一月 17, 2019 11:33:45 下午 com.alibaba.druid.sql.repository.SchemaRepository info
信息: replaced table 'define_cdetag'
   Manipulation : {define_cdetag=Create}
fields : [define_cdetag.id, define_cdetag.thiSection, define_cdetag.thiExceptList]
varchar
`define_cdetag`.`thiSection`
true
   Create

其實還有更多的DML相關的輔助信息,整個一套體系是比較全的。


本文分享自微信公衆號 - 楊建榮的學習筆記(jianrong-notes)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索